diff --git a/DEPS b/DEPS
index e446679..b8ab6cf 100644
--- a/DEPS
+++ b/DEPS
@@ -133,11 +133,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'e897c1bd16a8c7050d65067482fb890dfb9f1e71',
+  'skia_revision': '3061d27351076a36fce47fb82ce45d39cbdde3c0',
   # 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': '9e3a60426b207e9291b98e7b3de10ed0f2fadd01',
+  'v8_revision': 'aa52ef3fa846058455b64a82627cc9945e01381d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -145,15 +145,15 @@
   # 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': 'f5115ed4b0f61473d1c03997369b47abae30a252',
+  'angle_revision': 'a10b2d078ceb55cc1ba1bf6d7558095154f24163',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '4ac42dbf51807d2dcd78d0395e2ebf33195b869a',
+  'swiftshader_revision': '529eda3e56aa186ee17efe28319d30f33ba33372',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '93101066fa60961b58324276165a2de6126e0f5d',
+  'pdfium_revision': '17dedfae9feb1fd108aca77fd80bc641e64309ca',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -256,7 +256,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': 'd0a1f5a05a2b0f8315e5b3f17b8e34c730861b31',
+  'spv_tools_revision': 'cc3e93c4e6fb776b67863decfd69eb307df74ae1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -276,7 +276,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.
-  'quiche_revision': 'a037b8b34eab00e5208e67685ff82c7cf5133c1c',
+  'quiche_revision': '87c39c1ba976f007fdcc8f2f4e02231c3217eb01',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -806,7 +806,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '52e432e7d136a0d0eafd6fb9c91065d721dd2b96',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '50881afd45b2b652ac73443f5706d7051d7660a7',
       'condition': 'checkout_linux',
   },
 
@@ -831,7 +831,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e7f0b4c62c551cde2723d1456e007fcb10f53ac2',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8c66565649b7cae3bc80bba872b730902be7aa03',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -979,7 +979,7 @@
     Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '3874188bd69fe67a825d07584c74451e45063e95',
 
   'src/third_party/icu':
-    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'ae4b77dc8966796f0bd93bb6342023276749e148',
+    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '3a162e7afb4abf0668c3a01cf111ddcf223d2ec8',
 
   'src/third_party/icu4j': {
       'packages': [
@@ -1184,7 +1184,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '3cd2c388997d5387f7bf61b7358d32514ad6f611',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '826c8d4342d321fb921cf6e0704fe482c7a58348',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1396,7 +1396,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b6e71184c68cbdd23de1669b9944a32a33cf3af9',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d3fa0d1e938a9eabe9b6c002b481210b3879ee4e',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/app_list/app_list_presenter_delegate_impl.cc b/ash/app_list/app_list_presenter_delegate_impl.cc
index d0aecd9a..abf55e2 100644
--- a/ash/app_list/app_list_presenter_delegate_impl.cc
+++ b/ash/app_list/app_list_presenter_delegate_impl.cc
@@ -289,14 +289,21 @@
 }
 
 void AppListPresenterDelegateImpl::OnKeyEvent(ui::KeyEvent* event) {
+  // If keyboard traversal is already engaged, no-op.
   if (controller_->KeyboardTraversalEngaged())
     return;
 
-  // When in tablet mode, all events hit this function, so we must ensure that
-  // the home launcher is visible before setting an event handled.
+  // If the home launcher is not shown in tablet mode, ignore events.
+  if (IsTabletMode() && !presenter_->home_launcher_shown())
+    return;
+
+  // Don't absorb the first event for the search box while it is open
+  if (view_->search_box_view()->is_search_box_active())
+    return;
+
+  // Arrow keys or Tab will engage the traversal mode.
   if ((app_list::IsUnhandledArrowKeyEvent(*event) ||
-       event->key_code() == ui::VKEY_TAB) &&
-      (!IsTabletMode() || presenter_->home_launcher_shown())) {
+       event->key_code() == ui::VKEY_TAB)) {
     // Handle the first arrow key event to just show the focus rings.
     event->SetHandled();
     controller_->SetKeyboardTraversalMode(true);
diff --git a/ash/display/resolution_notification_controller_unittest.cc b/ash/display/resolution_notification_controller_unittest.cc
index 86d265ba..f395339 100644
--- a/ash/display/resolution_notification_controller_unittest.cc
+++ b/ash/display/resolution_notification_controller_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "ash/display/resolution_notification_controller.h"
 
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/screen_util.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
diff --git a/ash/lock_screen_action/lock_screen_action_background_controller_impl_unittest.cc b/ash/lock_screen_action/lock_screen_action_background_controller_impl_unittest.cc
index 2879038..c9431869 100644
--- a/ash/lock_screen_action/lock_screen_action_background_controller_impl_unittest.cc
+++ b/ash/lock_screen_action/lock_screen_action_background_controller_impl_unittest.cc
@@ -80,7 +80,9 @@
             .GetContentsView();
     views::View* background =
         LockScreenActionBackgroundViewTestApi(contents_view).GetBackground();
-    background->layer()->CompleteAllAnimations();
+    // The ink drop's layer is a sibling of the background's layer, so call this
+    // from the background's layer's parent.
+    background->layer()->parent()->CompleteAllAnimations();
   }
 
   views::Widget* GetBackgroundWidget() {
diff --git a/ash/mojo_interface_factory.cc b/ash/mojo_interface_factory.cc
index 4f0a1ab..9c3cf66 100644
--- a/ash/mojo_interface_factory.cc
+++ b/ash/mojo_interface_factory.cc
@@ -34,7 +34,6 @@
 #include "ash/note_taking_controller.h"
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
-#include "ash/session/session_controller_impl.h"
 #include "ash/shelf/shelf_controller.h"
 #include "ash/shell.h"
 #include "ash/shell_delegate.h"
@@ -217,11 +216,6 @@
   Shell::Get()->time_to_first_present_recorder()->Bind(std::move(request));
 }
 
-void BindSessionControllerRequestOnMainThread(
-    mojom::SessionControllerRequest request) {
-  Shell::Get()->session_controller()->BindRequest(std::move(request));
-}
-
 void BindShelfRequestOnMainThread(mojom::ShelfControllerRequest request) {
   Shell::Get()->shelf_controller()->BindRequest(std::move(request));
 }
@@ -367,9 +361,6 @@
   registry->AddInterface(
       base::BindRepeating(&BindProcessCreationTimeRecorderOnMainThread),
       main_thread_task_runner);
-  registry->AddInterface(
-      base::BindRepeating(&BindSessionControllerRequestOnMainThread),
-      main_thread_task_runner);
   registry->AddInterface(base::BindRepeating(&BindShelfRequestOnMainThread),
                          main_thread_task_runner);
   registry->AddInterface(
diff --git a/ash/multi_device_setup/multi_device_notification_presenter.cc b/ash/multi_device_setup/multi_device_notification_presenter.cc
index 85888ec..f2ebbf04 100644
--- a/ash/multi_device_setup/multi_device_notification_presenter.cc
+++ b/ash/multi_device_setup/multi_device_notification_presenter.cc
@@ -9,7 +9,6 @@
 
 #include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index 0d0d9b71..410277e41 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -103,6 +103,7 @@
     "rounded_corner_decorator.h",
     "scale_utility.cc",
     "scale_utility.h",
+    "session/session_activation_observer.h",
     "session/session_controller.cc",
     "session/session_controller.h",
     "session/session_controller_client.h",
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index d4d82230..75692780 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -30,7 +30,6 @@
 #include "ash/public/interfaces/note_taking_controller.mojom.h"
 #include "ash/public/interfaces/pref_connector.mojom.h"
 #include "ash/public/interfaces/process_creation_time_recorder.mojom.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/public/interfaces/shelf.mojom.h"
 #include "ash/public/interfaces/shelf_integration_test_api.mojom.h"
 #include "ash/public/interfaces/shutdown.mojom.h"
@@ -94,12 +93,11 @@
                   mojom::LoginScreen, mojom::MediaController,
                   mojom::NewWindowController, mojom::NightLightController,
                   mojom::NoteTakingController,
-                  mojom::ProcessCreationTimeRecorder, mojom::SessionController,
-                  mojom::ShelfController, mojom::ShutdownController,
-                  mojom::SplitViewController, mojom::SystemTray,
-                  mojom::TabletModeController, mojom::TrayAction,
-                  mojom::VoiceInteractionController, mojom::VpnList,
-                  mojom::WallpaperController>())
+                  mojom::ProcessCreationTimeRecorder, mojom::ShelfController,
+                  mojom::ShutdownController, mojom::SplitViewController,
+                  mojom::SystemTray, mojom::TabletModeController,
+                  mojom::TrayAction, mojom::VoiceInteractionController,
+                  mojom::VpnList, mojom::WallpaperController>())
           .ExposeCapability("display", service_manager::Manifest::InterfaceList<
                                            mojom::AshDisplayController,
                                            mojom::DisplayOutputProtection>())
diff --git a/ash/public/cpp/session/session_activation_observer.h b/ash/public/cpp/session/session_activation_observer.h
new file mode 100644
index 0000000..1fd968d5
--- /dev/null
+++ b/ash/public/cpp/session/session_activation_observer.h
@@ -0,0 +1,27 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_PUBLIC_CPP_SESSION_SESSION_ACTIVATION_OBSERVER_H_
+#define ASH_PUBLIC_CPP_SESSION_SESSION_ACTIVATION_OBSERVER_H_
+
+#include "ash/public/cpp/ash_public_export.h"
+#include "base/observer_list_types.h"
+
+namespace ash {
+
+// Interface for ash to notify client of sessions status for a specific
+// |account_id|.
+class ASH_PUBLIC_EXPORT SessionActivationObserver
+    : public base::CheckedObserver {
+ public:
+  // Called the session is becoming active or inactive.
+  virtual void OnSessionActivated(bool activated) = 0;
+
+  // Called when lock screen state changes.
+  virtual void OnLockStateChanged(bool locked) = 0;
+};
+
+}  // namespace ash
+
+#endif  // ASH_PUBLIC_CPP_SESSION_SESSION_ACTIVATION_OBSERVER_H_
diff --git a/ash/public/cpp/session/session_controller.h b/ash/public/cpp/session/session_controller.h
index d6a0f23..f9386c8 100644
--- a/ash/public/cpp/session/session_controller.h
+++ b/ash/public/cpp/session/session_controller.h
@@ -7,14 +7,20 @@
 
 #include <stdint.h>
 
+#include <string>
 #include <vector>
 
 #include "ash/public/cpp/ash_public_export.h"
 #include "ash/public/cpp/session/session_types.h"
+#include "base/callback_forward.h"
+#include "base/time/time.h"
+
+class AccountId;
 
 namespace ash {
 
 class SessionControllerClient;
+class SessionActivationObserver;
 
 // Interface to manage user sessions in ash.
 class ASH_PUBLIC_EXPORT SessionController {
@@ -40,6 +46,78 @@
   virtual void SetUserSessionOrder(
       const std::vector<uint32_t>& user_session_ids) = 0;
 
+  // Prepares ash for lock screen. Currently this ensures the current active
+  // window could not be used to mimic the lock screen. Lock screen is created
+  // after this call returns.
+  using PrepareForLockCallback = base::OnceClosure;
+  virtual void PrepareForLock(PrepareForLockCallback callback) = 0;
+
+  // Runs the pre-lock animation to start locking ash. When the call returns,
+  // |locked| == true means that the ash post-lock animation is finished and ash
+  // is fully locked. Otherwise |locked| is false, which means something is
+  // wrong for the lock and ash is not locked. When the call returns with a true
+  // |locked|, screen locker runs the post lock jobs such as a11y announcement
+  // etc. Invoked by the screen locker during initialization.
+  using StartLockCallback = base::OnceCallback<void(bool locked)>;
+  virtual void StartLock(StartLockCallback callback) = 0;
+
+  // Notifies ash that chrome lock animations are finished. This is the last
+  // event for locking. SessionController forwards it to PowerEventObserver.
+  virtual void NotifyChromeLockAnimationsComplete() = 0;
+
+  // Runs the pre-unlock animation. Invoked by the screen locker before
+  // dismissing. When the mojo call returns, screen locker takes that as a
+  // signal of finished unlock animation and dismisses itself.
+  using RunUnlockAnimationCallback = base::OnceClosure;
+  virtual void RunUnlockAnimation(RunUnlockAnimationCallback callback) = 0;
+
+  // Notifies that chrome is terminating.
+  virtual void NotifyChromeTerminating() = 0;
+
+  // Adds a countdown timer to the system tray menu and creates or updates a
+  // notification saying the session length is limited (e.g. a public session in
+  // a library). Setting |length_limit| to zero removes the notification.
+  // NOTE: Chrome enforces the limit, not ash. Ash could enforce it if local
+  // state prefs and user activity monitoring were available under mustash.
+  // http://crbug.com/729808
+  virtual void SetSessionLengthLimit(base::TimeDelta length_limit,
+                                     base::TimeTicks start_time) = 0;
+
+  // Returns whether it's ok to switch the active multiprofile user. May affect
+  // or be affected by system state such as window overview mode and screen
+  // casting.
+  using CanSwitchActiveUserCallback = base::OnceCallback<void(bool can_switch)>;
+  virtual void CanSwitchActiveUser(CanSwitchActiveUserCallback callback) = 0;
+
+  // Shows a dialog to explain the implications of signing in multiple users.
+  // If |on_accept| is false, |permanently_accept| is ignored.
+  using ShowMultiprofilesIntroDialogCallback =
+      base::OnceCallback<void(bool on_accept, bool permanently_accept)>;
+  virtual void ShowMultiprofilesIntroDialog(
+      ShowMultiprofilesIntroDialogCallback callback) = 0;
+
+  // Shows a dialog to confirm that the user wants to teleport a window to
+  // another desktop. If |on_accept| is false, |permanently_accept| is ignored.
+  using ShowTeleportWarningDialogCallback =
+      base::OnceCallback<void(bool on_accept, bool permanently_accept)>;
+  virtual void ShowTeleportWarningDialog(
+      ShowTeleportWarningDialogCallback callback) = 0;
+
+  // Shows a dialog that explains that the given user is no longer allowed in
+  // the session due to a policy change, and aborts the session.
+  virtual void ShowMultiprofilesSessionAbortedDialog(
+      const std::string& user_email) = 0;
+
+  // Adds/removes session activation observer. The observer is called when
+  // session with |account_id| is becoming active or inactive. The observer is
+  // immediately called for upon registration with the current status.
+  virtual void AddSessionActivationObserverForAccountId(
+      const AccountId& account_id,
+      SessionActivationObserver* observer) = 0;
+  virtual void RemoveSessionActivationObserverForAccountId(
+      const AccountId& account_id,
+      SessionActivationObserver* observer) = 0;
+
  protected:
   SessionController();
   virtual ~SessionController();
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn
index 11c4992..2842cbc2 100644
--- a/ash/public/interfaces/BUILD.gn
+++ b/ash/public/interfaces/BUILD.gn
@@ -51,7 +51,6 @@
     "note_taking_controller.mojom",
     "pref_connector.mojom",
     "process_creation_time_recorder.mojom",
-    "session_controller.mojom",
     "shelf.mojom",
     "shelf_integration_test_api.mojom",
     "shutdown.mojom",
diff --git a/ash/public/interfaces/session_controller.mojom b/ash/public/interfaces/session_controller.mojom
deleted file mode 100644
index 8a03368..0000000
--- a/ash/public/interfaces/session_controller.mojom
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module ash.mojom;
-
-import "components/account_id/interfaces/account_id.mojom";
-import "mojo/public/mojom/base/time.mojom";
-
-// Interface for ash client (e.g. Chrome) to set session info for ash.
-interface SessionController {
-  // Prepares ash for lock screen. Currently this ensures the current active
-  // window could not be used to mimic the lock screen. Lock screen is created
-  // after this call returns.
-  PrepareForLock() => ();
-
-  // Runs the pre-lock animation to start locking ash. When the call returns,
-  // |locked| == true means that the ash post-lock animation is finished and ash
-  // is fully locked. Otherwise |locked| is false, which means something is
-  // wrong for the lock and ash is not locked. When the call returns with a true
-  // |locked|, screen locker runs the post lock jobs such as a11y announcement
-  // etc. Invoked by the screen locker during initialization.
-  StartLock() => (bool locked);
-
-  // Notifies ash that chrome lock animations are finished. This is the last
-  // event for locking. SessionController forwards it to PowerEventObserver.
-  NotifyChromeLockAnimationsComplete();
-
-  // Runs the pre-unlock animation. Invoked by the screen locker before
-  // dismissing. When the mojo call returns, screen locker takes that as a
-  // signal of finished unlock animation and dismisses itself.
-  RunUnlockAnimation() => ();
-
-  // Notifies that chrome is terminating.
-  NotifyChromeTerminating();
-
-  // Adds a countdown timer to the system tray menu and creates or updates a
-  // notification saying the session length is limited (e.g. a public session in
-  // a library). Setting |length_limit| to zero removes the notification.
-  // NOTE: Chrome enforces the limit, not ash. Ash could enforce it if local
-  // state prefs and user activity monitoring were available under mustash.
-  // http://crbug.com/729808
-  SetSessionLengthLimit(mojo_base.mojom.TimeDelta length_limit,
-                        mojo_base.mojom.TimeTicks start_time);
-
-  // Returns whether it's ok to switch the active multiprofile user. May affect
-  // or be affected by system state such as window overview mode and screen
-  // casting.
-  CanSwitchActiveUser() => (bool can_switch);
-
-  // Shows a dialog to explain the implications of signing in multiple users.
-  // If |on_accept| is false, |permanently_accept| is ignored.
-  ShowMultiprofilesIntroDialog() => (bool on_accept, bool permanently_accept);
-
-  // Shows a dialog to confirm that the user wants to teleport a window to
-  // another desktop. If |on_accept| is false, |permanently_accept| is ignored.
-  ShowTeleportWarningDialog() => (bool on_accept, bool permanently_accept);
-
-  // Shows a dialog that explains that the given user is no longer allowed in
-  // the session due to a policy change, and aborts the session.
-  ShowMultiprofilesSessionAbortedDialog(string user_email);
-
-  // Adds session activation observer. The observer is called when session
-  // with |account_id| is becoming active or inactive. The observer is
-  // immediately called for upon registration with the current status.
-  AddSessionActivationObserverForAccountId(
-    signin.mojom.AccountId account_id, SessionActivationObserver observer);
-};
-
-// Interface for ash to notify client of sessions status for a specific
-// |account_id|.
-interface SessionActivationObserver {
-  // Called the session is becoming active or inactive.
-  OnSessionActivated(bool activated);
-
-  // Called when lock screen state changes.
-  OnLockStateChanged(bool locked);
-};
diff --git a/ash/session/session_activation_observer_holder.cc b/ash/session/session_activation_observer_holder.cc
index bff1f267..59ffc827 100644
--- a/ash/session/session_activation_observer_holder.cc
+++ b/ash/session/session_activation_observer_holder.cc
@@ -6,6 +6,8 @@
 
 #include <utility>
 
+#include "ash/public/cpp/session/session_activation_observer.h"
+#include "base/logging.h"
 #include "base/stl_util.h"
 
 namespace ash {
@@ -14,15 +16,26 @@
 
 SessionActivationObserverHolder::~SessionActivationObserverHolder() = default;
 
-void SessionActivationObserverHolder ::AddSessionActivationObserverForAccountId(
+void SessionActivationObserverHolder::AddForAccountId(
     const AccountId& account_id,
-    mojom::SessionActivationObserverPtr observer) {
+    SessionActivationObserver* observer) {
   if (!account_id.is_valid())
     return;
   auto& observers = observer_map_[account_id];
   if (!observers)
-    observers = std::make_unique<ObserverSet>();
-  observers->AddPtr(std::move(observer));
+    observers = std::make_unique<Observers>();
+  observers->AddObserver(observer);
+}
+
+void SessionActivationObserverHolder::RemoveForAccountId(
+    const AccountId& account_id,
+    SessionActivationObserver* observer) {
+  auto it = observer_map_.find(account_id);
+  if (it == observer_map_.end()) {
+    NOTREACHED();
+    return;
+  }
+  it->second->RemoveObserver(observer);
 }
 
 void SessionActivationObserverHolder::NotifyActiveSessionChanged(
@@ -30,24 +43,32 @@
     const AccountId& to) {
   auto it = observer_map_.find(from);
   if (it != observer_map_.end()) {
-    it->second->ForAllPtrs([](auto* ptr) { ptr->OnSessionActivated(false); });
+    for (auto& observer : *it->second)
+      observer.OnSessionActivated(false);
   }
 
   it = observer_map_.find(to);
   if (it != observer_map_.end()) {
-    it->second->ForAllPtrs([](auto* ptr) { ptr->OnSessionActivated(true); });
+    for (auto& observer : *it->second)
+      observer.OnSessionActivated(true);
   }
 
-  base::EraseIf(observer_map_, [](auto& item) { return item.second->empty(); });
+  PruneObserverMap();
 }
 
 void SessionActivationObserverHolder::NotifyLockStateChanged(bool locked) {
   for (const auto& it : observer_map_) {
-    it.second->ForAllPtrs(
-        [locked](auto* ptr) { ptr->OnLockStateChanged(locked); });
+    for (auto& observer : *it.second)
+      observer.OnLockStateChanged(locked);
   }
 
-  base::EraseIf(observer_map_, [](auto& item) { return item.second->empty(); });
+  PruneObserverMap();
+}
+
+void SessionActivationObserverHolder::PruneObserverMap() {
+  base::EraseIf(observer_map_, [](auto& item) {
+    return !item.second->might_have_observers();
+  });
 }
 
 }  // namespace ash
diff --git a/ash/session/session_activation_observer_holder.h b/ash/session/session_activation_observer_holder.h
index fff86b22..8cab279d 100644
--- a/ash/session/session_activation_observer_holder.h
+++ b/ash/session/session_activation_observer_holder.h
@@ -8,29 +8,33 @@
 #include <map>
 #include <memory>
 
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 #include "components/account_id/account_id.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
 
 namespace ash {
 
+class SessionActivationObserver;
+
 class SessionActivationObserverHolder {
  public:
   SessionActivationObserverHolder();
   ~SessionActivationObserverHolder();
 
-  void AddSessionActivationObserverForAccountId(
-      const AccountId& account_id,
-      mojom::SessionActivationObserverPtr observer);
+  void AddForAccountId(const AccountId& account_id,
+                       SessionActivationObserver* observer);
+  void RemoveForAccountId(const AccountId& account_id,
+                          SessionActivationObserver* observer);
 
   void NotifyActiveSessionChanged(const AccountId& from, const AccountId& to);
 
   void NotifyLockStateChanged(bool locked);
 
  private:
-  using ObserverSet = mojo::InterfacePtrSet<mojom::SessionActivationObserver>;
-  std::map<AccountId, std::unique_ptr<ObserverSet>> observer_map_;
+  void PruneObserverMap();
+
+  using Observers = base::ObserverList<SessionActivationObserver>;
+  std::map<AccountId, std::unique_ptr<Observers>> observer_map_;
 
   DISALLOW_COPY_AND_ASSIGN(SessionActivationObserverHolder);
 };
diff --git a/ash/session/session_controller_impl.cc b/ash/session/session_controller_impl.cc
index 492294a2..8f5b02f 100644
--- a/ash/session/session_controller_impl.cc
+++ b/ash/session/session_controller_impl.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "ash/metrics/user_metrics_recorder.h"
+#include "ash/public/cpp/session/session_activation_observer.h"
 #include "ash/public/cpp/session/session_controller_client.h"
 #include "ash/public/interfaces/pref_connector.mojom.h"
 #include "ash/public/interfaces/user_info.mojom.h"
@@ -77,11 +78,6 @@
     std::move(start_lock_callback_).Run(false /* locked */);
 }
 
-void SessionControllerImpl::BindRequest(
-    mojom::SessionControllerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
 int SessionControllerImpl::NumberOfLoggedInUsers() const {
   return static_cast<int>(user_sessions_.size());
 }
@@ -489,14 +485,19 @@
 
 void SessionControllerImpl::AddSessionActivationObserverForAccountId(
     const AccountId& account_id,
-    mojom::SessionActivationObserverPtr observer) {
+    SessionActivationObserver* observer) {
   bool locked = state_ == SessionState::LOCKED;
   observer->OnLockStateChanged(locked);
   observer->OnSessionActivated(user_sessions_.size() &&
                                user_sessions_[0]->user_info.account_id ==
                                    account_id);
-  session_activation_observer_holder_.AddSessionActivationObserverForAccountId(
-      account_id, std::move(observer));
+  session_activation_observer_holder_.AddForAccountId(account_id, observer);
+}
+
+void SessionControllerImpl::RemoveSessionActivationObserverForAccountId(
+    const AccountId& account_id,
+    SessionActivationObserver* observer) {
+  session_activation_observer_holder_.RemoveForAccountId(account_id, observer);
 }
 
 void SessionControllerImpl::ClearUserSessionsForTest() {
diff --git a/ash/session/session_controller_impl.h b/ash/session/session_controller_impl.h
index 1fc3759..0d12f172 100644
--- a/ash/session/session_controller_impl.h
+++ b/ash/session/session_controller_impl.h
@@ -14,14 +14,12 @@
 #include "ash/login_status.h"
 #include "ash/public/cpp/session/session_controller.h"
 #include "ash/public/cpp/session/session_types.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/session/session_activation_observer_holder.h"
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
 
 class AccountId;
 class PrefService;
@@ -38,8 +36,7 @@
 // Implements mojom::SessionController to cache session related info such as
 // session state, meta data about user sessions to support synchronous
 // queries for ash.
-class ASH_EXPORT SessionControllerImpl : public SessionController,
-                                         public mojom::SessionController {
+class ASH_EXPORT SessionControllerImpl : public SessionController {
  public:
   using UserSessions = std::vector<std::unique_ptr<UserSession>>;
 
@@ -53,9 +50,6 @@
   base::TimeDelta session_length_limit() const { return session_length_limit_; }
   base::TimeTicks session_start_time() const { return session_start_time_; }
 
-  // Binds the mojom::SessionControllerRequest to this object.
-  void BindRequest(mojom::SessionControllerRequest request);
-
   // Returns the number of signed in users. If 0 is returned, there is either
   // no session in progress or no active user.
   int NumberOfLoggedInUsers() const;
@@ -200,8 +194,6 @@
   void UpdateUserSession(const UserSession& user_session) override;
   void SetUserSessionOrder(
       const std::vector<uint32_t>& user_session_order) override;
-
-  // mojom::SessionController
   void PrepareForLock(PrepareForLockCallback callback) override;
   void StartLock(StartLockCallback callback) override;
   void NotifyChromeLockAnimationsComplete() override;
@@ -218,7 +210,10 @@
       const std::string& user_email) override;
   void AddSessionActivationObserverForAccountId(
       const AccountId& account_id,
-      mojom::SessionActivationObserverPtr observer) override;
+      SessionActivationObserver* observer) override;
+  void RemoveSessionActivationObserverForAccountId(
+      const AccountId& account_id,
+      SessionActivationObserver* observer) override;
 
   // Test helpers.
   void ClearUserSessionsForTest();
@@ -266,9 +261,6 @@
   // window, tries to activate one.
   void EnsureActiveWindowAfterUnblockingUserSession();
 
-  // Bindings for users of the mojom::SessionController interface.
-  mojo::BindingSet<mojom::SessionController> bindings_;
-
   // Client interface to session manager code (chrome).
   SessionControllerClient* client_ = nullptr;
 
diff --git a/ash/session/session_controller_impl_unittest.cc b/ash/session/session_controller_impl_unittest.cc
index 060548e1..97a9273 100644
--- a/ash/session/session_controller_impl_unittest.cc
+++ b/ash/session/session_controller_impl_unittest.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "ash/login_status.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/session/session_observer.h"
 #include "ash/session/test_session_controller_client.h"
 #include "ash/shell.h"
diff --git a/ash/session/test_session_controller_client.h b/ash/session/test_session_controller_client.h
index 4ecf2f46..d214705e 100644
--- a/ash/session/test_session_controller_client.h
+++ b/ash/session/test_session_controller_client.h
@@ -11,7 +11,6 @@
 
 #include "ash/public/cpp/session/session_controller_client.h"
 #include "ash/public/cpp/session/session_types.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
diff --git a/ash/shelf/overflow_bubble_view.cc b/ash/shelf/overflow_bubble_view.cc
index 487773d..8282a60 100644
--- a/ash/shelf/overflow_bubble_view.cc
+++ b/ash/shelf/overflow_bubble_view.cc
@@ -11,7 +11,6 @@
 #include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "ash/shelf/shelf_widget.h"
-#include "ash/shell.h"
 #include "ash/wm/window_util.h"
 #include "base/i18n/rtl.h"
 #include "ui/display/display.h"
@@ -39,16 +38,10 @@
                                        SkColor background_color)
     : ShelfBubble(anchor, shelf_view->shelf()->alignment(), background_color),
       shelf_(shelf_view->shelf()),
-      shelf_view_(shelf_view),
-      background_animator_(SHELF_BACKGROUND_DEFAULT,
-                           // Don't pass the Shelf so the translucent color is
-                           // always used.
-                           nullptr,
-                           Shell::Get()->wallpaper_controller()) {
+      shelf_view_(shelf_view) {
   DCHECK(shelf_);
 
   set_border_radius(ShelfConstants::shelf_size() / 2);
-  background_animator_.AddObserver(this);
   SetArrow(views::BubbleBorder::NONE);
   SetBackground(nullptr);
   set_shadow(views::BubbleBorder::NO_ASSETS);
@@ -70,9 +63,7 @@
   AddChildView(shelf_view_);
 }
 
-OverflowBubbleView::~OverflowBubbleView() {
-  background_animator_.RemoveObserver(this);
-}
+OverflowBubbleView::~OverflowBubbleView() = default;
 
 bool OverflowBubbleView::ProcessGestureEvent(const ui::GestureEvent& event) {
   // Handle scroll-related events, but don't do anything special for begin and
@@ -236,8 +227,4 @@
   return false;
 }
 
-void OverflowBubbleView::UpdateShelfBackground(SkColor color) {
-  set_color(color);
-}
-
 }  // namespace ash
diff --git a/ash/shelf/overflow_bubble_view.h b/ash/shelf/overflow_bubble_view.h
index d59f9dc..e71ed64 100644
--- a/ash/shelf/overflow_bubble_view.h
+++ b/ash/shelf/overflow_bubble_view.h
@@ -6,8 +6,6 @@
 #define ASH_SHELF_OVERFLOW_BUBBLE_VIEW_H_
 
 #include "ash/ash_export.h"
-#include "ash/shelf/shelf_background_animator.h"
-#include "ash/shelf/shelf_background_animator_observer.h"
 #include "ash/shelf/shelf_bubble.h"
 #include "base/macros.h"
 
@@ -17,8 +15,7 @@
 
 // OverflowBubbleView hosts a ShelfView to display overflown items.
 // Exports to access this class from OverflowBubbleViewTestAPI.
-class ASH_EXPORT OverflowBubbleView : public ShelfBubble,
-                                      public ShelfBackgroundAnimatorObserver {
+class ASH_EXPORT OverflowBubbleView : public ShelfBubble {
  public:
   // |anchor| is the overflow button on the main shelf. |shelf_view| is the
   // ShelfView containing the overflow items.
@@ -57,15 +54,10 @@
   // ui::EventHandler:
   void OnScrollEvent(ui::ScrollEvent* event) override;
 
-  // ShelfBackgroundAnimatorObserver:
-  void UpdateShelfBackground(SkColor color) override;
-
   Shelf* shelf_;
   ShelfView* shelf_view_;  // Owned by views hierarchy.
   gfx::Vector2d scroll_offset_;
 
-  ShelfBackgroundAnimator background_animator_;
-
   DISALLOW_COPY_AND_ASSIGN(OverflowBubbleView);
 };
 
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc
index 814fbae..272a96e5 100644
--- a/ash/shelf/shelf_bubble.cc
+++ b/ash/shelf/shelf_bubble.cc
@@ -30,8 +30,13 @@
 ShelfBubble::ShelfBubble(views::View* anchor,
                          ShelfAlignment alignment,
                          SkColor background_color)
-    : views::BubbleDialogDelegateView(anchor, GetArrow(alignment)) {
-  set_color(background_color);
+    : views::BubbleDialogDelegateView(anchor, GetArrow(alignment)),
+      background_animator_(SHELF_BACKGROUND_DEFAULT,
+                           // Don't pass the Shelf so the translucent color is
+                           // always used.
+                           nullptr,
+                           Shell::Get()->wallpaper_controller()) {
+  background_animator_.AddObserver(this);
 
   // Place the bubble in the same display as the anchor.
   set_parent_window(
@@ -39,6 +44,10 @@
           kShellWindowId_SettingBubbleContainer));
 }
 
+ShelfBubble::~ShelfBubble() {
+  background_animator_.RemoveObserver(this);
+}
+
 ax::mojom::Role ShelfBubble::GetAccessibleWindowRole() {
   // We override the role because the base class sets it to alert dialog,
   // which results in each tooltip title being announced twice on screen
@@ -59,4 +68,8 @@
   return ui::DIALOG_BUTTON_NONE;
 }
 
+void ShelfBubble::UpdateShelfBackground(SkColor color) {
+  set_color(color);
+}
+
 }  // namespace ash
diff --git a/ash/shelf/shelf_bubble.h b/ash/shelf/shelf_bubble.h
index 31298a7..785c68e 100644
--- a/ash/shelf/shelf_bubble.h
+++ b/ash/shelf/shelf_bubble.h
@@ -7,6 +7,9 @@
 
 #include "ash/ash_export.h"
 #include "ash/public/cpp/shelf_types.h"
+#include "ash/shelf/shelf_background_animator.h"
+#include "ash/shelf/shelf_background_animator_observer.h"
+#include "ash/shell.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 namespace views {
@@ -16,11 +19,13 @@
 namespace ash {
 
 // A base class for all shelf tooltip bubbles.
-class ASH_EXPORT ShelfBubble : public views::BubbleDialogDelegateView {
+class ASH_EXPORT ShelfBubble : public views::BubbleDialogDelegateView,
+                               public ShelfBackgroundAnimatorObserver {
  public:
   ShelfBubble(views::View* anchor,
               ShelfAlignment alignment,
               SkColor background_co0lor);
+  ~ShelfBubble() override;
 
   // views::BubbleDialogDelegateView
   ax::mojom::Role GetAccessibleWindowRole() override;
@@ -43,8 +48,13 @@
   // BubbleDialogDelegateView overrides:
   int GetDialogButtons() const override;
 
+  // ShelfBackgroundAnimatorObserver:
+  void UpdateShelfBackground(SkColor color) override;
+
   int border_radius_ = 0;
 
+  ShelfBackgroundAnimator background_animator_;
+
   DISALLOW_COPY_AND_ASSIGN(ShelfBubble);
 };
 
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index f2f3a33..2426f8d2 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -45,6 +45,9 @@
 
 constexpr int kShelfRoundedCornerRadius = 28;
 constexpr int kShelfBlurRadius = 30;
+// The maximum size of the opaque layer during an "overshoot" (drag away from
+// the screen edge).
+constexpr int kShelfMaxOvershootHeight = 32;
 constexpr float kShelfBlurQuality = 0.33f;
 
 // Return the first or last focusable child of |root|.
@@ -226,7 +229,11 @@
   // To achieve this, we extend the layer in the same direction where the shelf
   // is aligned (downwards for a bottom shelf, etc.).
   const int radius = kShelfRoundedCornerRadius;
-  const int safety_margin = 3 * radius;
+  // With shader rounded corners, we can easily round only 2 corners out of
+  // 4 which means we don't need as much extra shelf height.
+  const int safety_margin = ash::features::ShouldUseShaderRoundedCorner()
+                                ? kShelfMaxOvershootHeight
+                                : 3 * radius;
   opaque_background_bounds.Inset(
       -shelf->SelectValueForShelfAlignment(0, safety_margin, 0), 0,
       -shelf->SelectValueForShelfAlignment(0, 0, safety_margin),
diff --git a/ash/system/unified/unified_system_tray_controller_unittest.cc b/ash/system/unified/unified_system_tray_controller_unittest.cc
index 3110d89..2199ce6 100644
--- a/ash/system/unified/unified_system_tray_controller_unittest.cc
+++ b/ash/system/unified/unified_system_tray_controller_unittest.cc
@@ -5,7 +5,6 @@
 #include "ash/system/unified/unified_system_tray_controller.h"
 
 #include "ash/public/cpp/ash_features.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "ash/system/message_center/ash_message_center_lock_screen_controller.h"
diff --git a/ash/wm/splitview/split_view_divider.cc b/ash/wm/splitview/split_view_divider.cc
index d8f5734..6ba4cf0 100644
--- a/ash/wm/splitview/split_view_divider.cc
+++ b/ash/wm/splitview/split_view_divider.cc
@@ -494,6 +494,8 @@
   DividerView* divider_view = new DividerView(this);
   divider_widget_->set_focus_on_creation(false);
   divider_widget_->Init(params);
+  divider_widget_->SetVisibilityAnimationTransition(
+      views::Widget::ANIMATE_NONE);
   divider_widget_->SetContentsView(divider_view);
   divider_widget_->SetBounds(GetDividerBoundsInScreen(false /* is_dragging */));
   divider_widget_->Show();
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 48c0c7c..0b03c11 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -744,6 +744,8 @@
     "task/common/intrusive_heap.h",
     "task/common/operations_controller.cc",
     "task/common/operations_controller.h",
+    "task/common/scoped_defer_task_posting.cc",
+    "task/common/scoped_defer_task_posting.h",
     "task/common/task_annotator.cc",
     "task/common/task_annotator.h",
     "task/lazy_task_runner.cc",
diff --git a/base/task/common/scoped_defer_task_posting.cc b/base/task/common/scoped_defer_task_posting.cc
new file mode 100644
index 0000000..9dc719c
--- /dev/null
+++ b/base/task/common/scoped_defer_task_posting.cc
@@ -0,0 +1,86 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/task/common/scoped_defer_task_posting.h"
+
+#include "base/no_destructor.h"
+#include "base/threading/thread_local.h"
+
+namespace base {
+
+namespace {
+
+ThreadLocalPointer<ScopedDeferTaskPosting>& GetScopedDeferTaskPostingTLS() {
+  static NoDestructor<ThreadLocalPointer<ScopedDeferTaskPosting>> tls;
+  return *tls;
+}
+
+}  // namespace
+
+// static
+void ScopedDeferTaskPosting::PostOrDefer(
+    scoped_refptr<SequencedTaskRunner> task_runner,
+    const Location& from_here,
+    OnceClosure task) {
+  ScopedDeferTaskPosting* scope = Get();
+  if (scope) {
+    scope->DeferTaskPosting(std::move(task_runner), from_here, std::move(task));
+    return;
+  }
+
+  task_runner->PostTask(from_here, std::move(task));
+}
+
+// static
+ScopedDeferTaskPosting* ScopedDeferTaskPosting::Get() {
+  return GetScopedDeferTaskPostingTLS().Get();
+}
+
+// static
+void ScopedDeferTaskPosting::Set(ScopedDeferTaskPosting* scope) {
+  // We can post a task from within a ScheduleWork in some tests, so we can
+  // get nested scopes. In this case ignore all except the top one.
+  if (!Get())
+    return;
+  return GetScopedDeferTaskPostingTLS().Set(scope);
+}
+
+// static
+bool ScopedDeferTaskPosting::IsPresent() {
+  return !!Get();
+}
+
+ScopedDeferTaskPosting::ScopedDeferTaskPosting() {
+  Set(this);
+}
+
+ScopedDeferTaskPosting::~ScopedDeferTaskPosting() {
+  Set(nullptr);
+  for (DeferredTask& deferred_task : deferred_tasks_) {
+    deferred_task.task_runner->PostTask(deferred_task.from_here,
+                                        std::move(deferred_task.task));
+  }
+}
+
+ScopedDeferTaskPosting::DeferredTask::DeferredTask(
+    scoped_refptr<SequencedTaskRunner> task_runner,
+    Location from_here,
+    OnceClosure task)
+    : task_runner(std::move(task_runner)),
+      from_here(from_here),
+      task(std::move(task)) {}
+
+ScopedDeferTaskPosting::DeferredTask::DeferredTask(DeferredTask&&) = default;
+
+ScopedDeferTaskPosting::DeferredTask::~DeferredTask() = default;
+
+void ScopedDeferTaskPosting::DeferTaskPosting(
+    scoped_refptr<SequencedTaskRunner> task_runner,
+    const Location& from_here,
+    OnceClosure task) {
+  deferred_tasks_.push_back(
+      {std::move(task_runner), from_here, std::move(task)});
+}
+
+}  // namespace base
diff --git a/base/task/common/scoped_defer_task_posting.h b/base/task/common/scoped_defer_task_posting.h
new file mode 100644
index 0000000..ebc12fc
--- /dev/null
+++ b/base/task/common/scoped_defer_task_posting.h
@@ -0,0 +1,64 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TASK_COMMON_SCOPED_DEFER_TASK_POSTING_H_
+#define BASE_TASK_COMMON_SCOPED_DEFER_TASK_POSTING_H_
+
+#include "base/base_export.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/sequenced_task_runner.h"
+
+namespace base {
+
+// Tracing wants to post tasks from within a trace event within PostTask, but
+// this can lead to a deadlock. Create a scope to ensure that we are posting
+// the tasks in question outside of the scope of the lock.
+// NOTE: This scope affects only the thread it is created on. All other threads
+// still can post tasks.
+//
+// TODO(altimin): It should be possible to get rid of this scope, but this
+// requires refactoring TimeDomain to ensure that TimeDomain never changes and
+// we can read current time without grabbing a lock.
+class BASE_EXPORT ScopedDeferTaskPosting {
+ public:
+  static void PostOrDefer(scoped_refptr<SequencedTaskRunner> task_runner,
+                          const Location& from_here,
+                          OnceClosure task);
+
+  static bool IsPresent();
+
+  ScopedDeferTaskPosting();
+  ~ScopedDeferTaskPosting();
+
+ private:
+  static ScopedDeferTaskPosting* Get();
+  static void Set(ScopedDeferTaskPosting* scope);
+
+  void DeferTaskPosting(scoped_refptr<SequencedTaskRunner> task_runner,
+                        const Location& from_here,
+                        OnceClosure task);
+
+  struct DeferredTask {
+    DeferredTask(scoped_refptr<SequencedTaskRunner> task_runner,
+                 Location from_here,
+                 OnceClosure task);
+    DeferredTask(DeferredTask&& task);
+    ~DeferredTask();
+
+    scoped_refptr<SequencedTaskRunner> task_runner;
+    Location from_here;
+    OnceClosure task;
+
+    DISALLOW_COPY_AND_ASSIGN(DeferredTask);
+  };
+
+  std::vector<DeferredTask> deferred_tasks_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedDeferTaskPosting);
+};
+
+}  // namespace base
+
+#endif  // BASE_TASK_COMMON_SCOPED_DEFER_TASK_POSTING_H_
diff --git a/base/task/common/task_annotator.cc b/base/task/common/task_annotator.cc
index e47be1e..d5d0428 100644
--- a/base/task/common/task_annotator.cc
+++ b/base/task/common/task_annotator.cc
@@ -66,8 +66,7 @@
   DCHECK(task_queue_name);
   TRACE_EVENT_WITH_FLOW1(
       TRACE_DISABLED_BY_DEFAULT("toplevel.flow"), trace_event_name,
-      TRACE_ID_MANGLE(GetTaskTraceID(*pending_task)),
-      TRACE_EVENT_FLAG_FLOW_OUT | TRACE_EVENT_FLAG_DISALLOW_POSTTASK,
+      TRACE_ID_MANGLE(GetTaskTraceID(*pending_task)), TRACE_EVENT_FLAG_FLOW_OUT,
       "task_queue_name", task_queue_name);
 
   DCHECK(!pending_task->task_backtrace[0])
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 9194671..b72a9b0 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/strings/stringprintf.h"
+#include "base/task/common/scoped_defer_task_posting.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/sequence_manager/time_domain.h"
 #include "base/task/sequence_manager/work_queue.h"
@@ -49,6 +50,8 @@
 TaskQueueImpl::GuardedTaskPoster::~GuardedTaskPoster() {}
 
 bool TaskQueueImpl::GuardedTaskPoster::PostTask(PostedTask task) {
+  ScopedDeferTaskPosting disallow_task_posting;
+
   auto token = operations_controller_.TryBeginOperation();
   if (!token)
     return false;
@@ -565,14 +568,16 @@
   if (!associated_thread_->IsBoundToCurrentThread())
     return;
 
-  base::internal::CheckedAutoLock lock(any_thread_lock_);
-  TRACE_COUNTER_WITH_FLAG1(
-      TRACE_DISABLED_BY_DEFAULT("sequence_manager"), GetName(),
-      TRACE_EVENT_FLAG_DISALLOW_POSTTASK,
-      any_thread_.immediate_incoming_queue.size() +
-          main_thread_only().immediate_work_queue->Size() +
-          main_thread_only().delayed_work_queue->Size() +
-          main_thread_only().delayed_incoming_queue.size());
+  size_t total_task_count;
+  {
+    base::internal::CheckedAutoLock lock(any_thread_lock_);
+    total_task_count = any_thread_.immediate_incoming_queue.size() +
+                       main_thread_only().immediate_work_queue->Size() +
+                       main_thread_only().delayed_work_queue->Size() +
+                       main_thread_only().delayed_incoming_queue.size();
+  }
+  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("sequence_manager"), GetName(),
+                 total_task_count);
 }
 
 void TaskQueueImpl::SetQueuePriority(TaskQueue::QueuePriority priority) {
diff --git a/base/trace_event/common/trace_event_common.h b/base/trace_event/common/trace_event_common.h
index c6fed99..f1878a1 100644
--- a/base/trace_event/common/trace_event_common.h
+++ b/base/trace_event/common/trace_event_common.h
@@ -1072,7 +1072,6 @@
 #define TRACE_EVENT_FLAG_HAS_PROCESS_ID (static_cast<unsigned int>(1 << 11))
 #define TRACE_EVENT_FLAG_HAS_LOCAL_ID (static_cast<unsigned int>(1 << 12))
 #define TRACE_EVENT_FLAG_HAS_GLOBAL_ID (static_cast<unsigned int>(1 << 13))
-#define TRACE_EVENT_FLAG_DISALLOW_POSTTASK (static_cast<unsigned int>(1 << 14))
 // TODO(eseckler): Remove once we have native support for typed proto events in
 // TRACE_EVENT macros.
 #define TRACE_EVENT_FLAG_TYPED_PROTO_ARGS (static_cast<unsigned int>(1 << 15))
diff --git a/build/android/gradle/generate_gradle.py b/build/android/gradle/generate_gradle.py
index f2bcec5..77f7350d 100755
--- a/build/android/gradle/generate_gradle.py
+++ b/build/android/gradle/generate_gradle.py
@@ -123,12 +123,11 @@
   subprocess.check_call(cmd)
 
 
-def _RunNinja(output_dir, args, j):
+def _RunNinja(output_dir, args):
   cmd = [
-      os.path.join(_DEPOT_TOOLS_PATH, 'ninja'),
+      os.path.join(_DEPOT_TOOLS_PATH, 'autoninja'),
       '-C',
       output_dir,
-      '-j{}'.format(j),
   ]
   cmd.extend(args)
   logging.info('Running: %r', cmd)
@@ -807,9 +806,6 @@
   parser.add_argument('--fast',
                       action='store_true',
                       help='Skip generating R.java and other generated files.')
-  parser.add_argument('-j',
-                      default=1000 if os.path.exists(_SRC_INTERNAL) else 50,
-                      help='Value for number of parallel jobs for ninja')
   parser.add_argument('--native-target',
                       dest='native_targets',
                       action='append',
@@ -868,7 +864,7 @@
       _RunGnGen(output_dir)
     else:
       # Faster than running "gn gen" in the no-op case.
-      _RunNinja(output_dir, ['build.ninja'], args.j)
+      _RunNinja(output_dir, ['build.ninja'])
     # Query ninja for all __build_config_crbug_908819 targets.
     targets = _QueryForAllGnTargets(output_dir)
   else:
@@ -898,8 +894,7 @@
   main_entries = [_ProjectEntry.FromGnTarget(t) for t in targets]
 
   logging.warning('Building .build_config files...')
-  _RunNinja(
-      output_dir, [e.NinjaBuildConfigTarget() for e in main_entries], args.j)
+  _RunNinja(output_dir, [e.NinjaBuildConfigTarget() for e in main_entries])
 
   if args.all:
     # There are many unused libraries, so restrict to those that are actually
@@ -961,7 +956,7 @@
   if generated_inputs:
     logging.warning('Building generated source files...')
     targets = _RebasePath(generated_inputs, output_dir)
-    _RunNinja(output_dir, targets, args.j)
+    _RunNinja(output_dir, targets)
   if zip_tuples:
     _ExtractZips(generator.project_dir, zip_tuples)
 
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index c351d6ba..d7a94a5 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -57,7 +57,9 @@
 
   # Enables support for ThinLTO, which links 3x-10x faster than full LTO. See
   # also http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html
-  use_thin_lto = is_cfi || (is_android && is_official_build)
+  # TODO(thakis): Re-add `|| (is_android && is_official_build)` once lld and
+  # resource whitelist generation can coexist again, https://crbug.com/960881
+  use_thin_lto = is_cfi
 
   # Tell VS to create a PDB that references information in .obj files rather
   # than copying it all. This should improve linker performance. mspdbcmf.exe
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 392300b4..69e4b30 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8914040861094280272
\ No newline at end of file
+8914010619758962160
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index f6b3b8f5..dfeaf29 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8914040284923388736
\ No newline at end of file
+8914022441954645264
\ No newline at end of file
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc
index b09ded1e..2121d1ca 100644
--- a/cc/input/scroll_snap_data.cc
+++ b/cc/input/scroll_snap_data.cc
@@ -112,6 +112,9 @@
 bool SnapContainerData::FindSnapPosition(
     const SnapSelectionStrategy& strategy,
     gfx::ScrollOffset* snap_position) const {
+  if (scroll_snap_type_.is_none)
+    return false;
+
   gfx::ScrollOffset base_position = strategy.base_position();
   SnapAxis axis = scroll_snap_type_.axis;
   bool should_snap_on_x = strategy.ShouldSnapOnX() &&
diff --git a/cc/input/scroll_snap_data.h b/cc/input/scroll_snap_data.h
index 9938c0b..f68d903 100644
--- a/cc/input/scroll_snap_data.h
+++ b/cc/input/scroll_snap_data.h
@@ -154,11 +154,15 @@
 
 typedef std::vector<SnapAreaData> SnapAreaList;
 
-// Snap container is a scroll container that has non-'none' value for
-// scroll-snap-type. It can be snapped to one of its snap areas when a scroll
-// happens.
+// Snap container is a scroll container that at least one snap area assigned to
+// it.  If the snap-type is not 'none', then it can be snapped to one of its
+// snap areas when a scroll happens.
 // This data structure describes the data needed for SnapCoordinator to perform
 // snapping in the snap container.
+//
+// Note that the snap area data should only be used when snap-type is not 'none'
+// There is not guarantee that this information is up-to-date otherwise. In
+// fact, we skip updating these info as an optiomization.
 class CC_EXPORT SnapContainerData {
  public:
   SnapContainerData();
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 6529693..8841b1ec 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -647,16 +647,8 @@
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:exported="false">
         </activity>
-        {% if notouch_build == "true" %}
-        <activity-alias android:name="org.chromium.chrome.browser.preferences.Preferences"
-            android:targetActivity="org.chromium.chrome.browser.touchless.TouchlessPreferences">
-        </activity-alias>
-        <activity android:name="org.chromium.chrome.browser.touchless.TouchlessPreferences"
-            android:theme="@style/Theme.Chromium.Preferences.Touchless"
-        {% else %}
         <activity android:name="org.chromium.chrome.browser.preferences.Preferences"
             android:theme="@style/Theme.Chromium.Preferences"
-        {% endif %}
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:label="@string/preferences"
             android:exported="false">
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index c858161..44d465a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -243,6 +243,7 @@
     public static final String HOME_PAGE_BUTTON_FORCE_ENABLED = "HomePageButtonForceEnabled";
     public static final String HOMEPAGE_TILE = "HomepageTile";
     public static final String HORIZONTAL_TAB_SWITCHER_ANDROID = "HorizontalTabSwitcherAndroid";
+    public static final String IDENTITY_DISC = "IdentityDisc";
     public static final String IMMERSIVE_UI_MODE = "ImmersiveUiMode";
     public static final String INCOGNITO_STRINGS = "IncognitoStrings";
     public static final String INLINE_UPDATE_FLOW = "InlineUpdateFlow";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java b/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
index b09940e..cf6d4c9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/NavigationPopup.java
@@ -10,6 +10,7 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
+import android.support.v7.content.res.AppCompatResources;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -291,6 +292,14 @@
             setViewText(entry, viewHolder.mTextView);
             viewHolder.mImageView.setImageBitmap(entry.getFavicon());
 
+            if (entry.getIndex() == FULL_HISTORY_ENTRY_INDEX) {
+                ApiCompatibilityUtils.setImageTintList(viewHolder.mImageView,
+                        AppCompatResources.getColorStateList(
+                                mContext, R.color.default_icon_color_blue));
+            } else {
+                ApiCompatibilityUtils.setImageTintList(viewHolder.mImageView, null);
+            }
+
             if (mType == Type.ANDROID_SYSTEM_BACK) {
                 View container = viewHolder.mContainer;
                 if (mTopPadding == null) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
index 0697d1e..e0fbcdf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/NavigationRecorderTest.java
@@ -57,7 +57,10 @@
 
     @After
     public void tearDown() {
-        mTestServer.stopAndDestroyServer();
+        // If setUp() fails, tearDown() still needs to be able to execute without exceptions.
+        if (mTestServer != null) {
+            mTestServer.stopAndDestroyServer();
+        }
     }
 
     @Test
diff --git a/chrome/android/touchless/java/res/values-v17/styles.xml b/chrome/android/touchless/java/res/values-v17/styles.xml
index 6ff2eab..838951a 100644
--- a/chrome/android/touchless/java/res/values-v17/styles.xml
+++ b/chrome/android/touchless/java/res/values-v17/styles.xml
@@ -13,14 +13,4 @@
         <item name="android:textSize">14sp</item>
         <item name="android:textColor">@android:color/white</item>
     </style>
-
-    <style name="PreferenceActionBarModern.Touchless">
-        <item name="titleTextStyle">@style/TextAppearance.BlackTitle1</item>
-    </style>
-
-    <style name="Theme.Chromium.Preferences.Touchless">
-        <item name="android:statusBarColor" tools:targetApi="21">@color/modern_primary_color</item>
-        <item name="android:windowLightStatusBar" tools:targetApi="23">@bool/window_light_navigation_bar</item>
-        <item name="actionBarStyle">@style/PreferenceActionBarModern.Touchless</item>
-    </style>
 </resources>
\ No newline at end of file
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/NoTouchActivity.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/NoTouchActivity.java
index 1bf5522..74ff804 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/NoTouchActivity.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/NoTouchActivity.java
@@ -153,7 +153,7 @@
     public void initializeState() {
         mInactivityTracker = new ChromeInactivityTracker(
                 LAST_BACKGROUNDED_TIME_MS_PREF, this.getLifecycleDispatcher());
-        boolean launchNtpDueToInactivity = shouldForceNTPDueToInactivity();
+        boolean launchNtpDueToInactivity = shouldForceNTPDueToInactivity(null);
 
         // SingleTabActivity#initializeState creates a tab based on #getSavedInstanceState(), so if
         // we need to clear it due to inactivity, we should do it before calling
@@ -189,7 +189,11 @@
         resetSavedInstanceState();
     }
 
-    private boolean shouldForceNTPDueToInactivity() {
+    private boolean shouldForceNTPDueToInactivity(Intent intent) {
+        if (intent != null) {
+            String intentData = intent.getDataString();
+            if (intentData != null && !intentData.isEmpty()) return false;
+        }
         if (mInactivityTracker == null) return false;
         if (mTabObserver == null) return false;
 
@@ -209,7 +213,7 @@
 
     @Override
     public void onNewIntentWithNative(Intent intent) {
-        if (shouldForceNTPDueToInactivity()) {
+        if (shouldForceNTPDueToInactivity(intent)) {
             if (!mIntentHandler.shouldIgnoreIntent(intent)) {
                 if (!NTP_URL.equals(getActivityTab().getUrl())) {
                     intent.setData(Uri.parse(NTP_URL));
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
deleted file mode 100644
index ce8b3035..0000000
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.touchless;
-
-import android.os.Bundle;
-import android.view.Menu;
-
-import org.chromium.chrome.browser.preferences.Preferences;
-
-/**
- * The Chrome settings activity for touchless devices.
- */
-public class TouchlessPreferences extends Preferences {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        return false;
-    }
-}
diff --git a/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/NoTouchActivityTest.java b/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/NoTouchActivityTest.java
index 26a5b0a..062d013a 100644
--- a/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/NoTouchActivityTest.java
+++ b/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/NoTouchActivityTest.java
@@ -39,6 +39,7 @@
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class NoTouchActivityTest {
     private static final String TEST_PATH = "/chrome/test/data/android/simple.html";
+    private static final String TEST_PATH_2 = "/chrome/test/data/android/test.html";
 
     @Rule
     public ChromeActivityTestRule<NoTouchActivity> mActivityTestRule =
@@ -157,13 +158,40 @@
                     mTestServer.getURL(TEST_PATH));
         });
 
-        mActivity = ApplicationTestUtils.recreateActivity(mActivity);
-        mActivityTestRule.setActivity(mActivity);
-        mActivityTestRule.waitForActivityNativeInitializationComplete();
+        ApplicationTestUtils.fireHomeScreenIntent(mActivityTestRule.getActivity());
+        ApplicationTestUtils.launchChrome(mActivityTestRule.getActivity());
         CriteriaHelper.pollUiThread(
                 () -> mActivity.getActivityTab().getNativePage() instanceof TouchlessNewTabPage);
     }
 
+    @Test
+    @MediumTest
+    @CommandLineFlags.
+    Add({"enable-features=" + ChromeInactivityTracker.FEATURE_NAME + "<FakeStudyName",
+            "force-fieldtrials=FakeStudyName/Enabled",
+            "force-fieldtrial-params=FakeStudyName.Enabled:" + NTP_LAUNCH_DELAY_IN_MINS_PARAM
+                    + "/0"})
+    public void
+    testViewUrlAfterInactivity() throws Throwable {
+        mActivityTestRule.startMainActivityFromLauncher();
+        mActivity = mActivityTestRule.getActivity();
+        mActivityTestRule.loadUrl(mTestServer.getURL(TEST_PATH));
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertEquals(mActivity.getActivityTab().getWebContents().getLastCommittedUrl(),
+                    mTestServer.getURL(TEST_PATH));
+        });
+
+        ApplicationTestUtils.fireHomeScreenIntent(mActivityTestRule.getActivity());
+
+        String alternateUrl = mTestServer.getURL(TEST_PATH_2);
+        mActivityTestRule.startMainActivityWithURL(alternateUrl);
+
+        CriteriaHelper.pollUiThread(
+                ()
+                        -> alternateUrl.equals(
+                                mActivity.getActivityTab().getWebContents().getLastCommittedUrl()));
+    }
+
     /**
      * Tests that Safe Browsing and interstitials work.
      */
diff --git a/chrome/android/touchless/touchless_java_sources.gni b/chrome/android/touchless/touchless_java_sources.gni
index 171a615f..55a84d4 100644
--- a/chrome/android/touchless/touchless_java_sources.gni
+++ b/chrome/android/touchless/touchless_java_sources.gni
@@ -38,7 +38,6 @@
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediator.java",
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageProperties.java",
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageTopLayout.java",
-  "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java",
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessRecyclerView.java",
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessSuggestionsBinder.java",
   "touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessTabObserver.java",
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index deff071..1e51a63 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -665,6 +665,9 @@
       Reset to default
     </message>
   </if>
+  <message name="IDS_SETTINGS_CHROME_COLORS" desc="Text of the label describing 'Chrome Colors' theme.">
+    Chrome Colors
+  </message>
   <message name="IDS_SETTINGS_SHOW_HOME_BUTTON" desc="Label for the checkbox which enables or disables showing the home button in the toolbar.">
     Show home button
   </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CHROME_COLORS.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CHROME_COLORS.png.sha1
new file mode 100644
index 0000000..37ae547
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CHROME_COLORS.png.sha1
@@ -0,0 +1 @@
+93d419359fdd5daa722510d6bb73413ab263e78d
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 70f474e..b5fba2a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3683,6 +3683,9 @@
      flag_descriptions::kMobileIdentityConsistencyName,
      flag_descriptions::kMobileIdentityConsistencyDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(signin::kMiceFeature)},
+    {"identity-disc", flag_descriptions::kIdentityDiscName,
+     flag_descriptions::kIdentityDiscDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kIdentityDisc)},
 #endif  // defined(OS_ANDROID)
 
     {"autofill-use-improved-label-disambiguation",
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 9a1bb72d..6615312 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -141,6 +141,7 @@
     &kHomePageButtonForceEnabled,
     &kHomepageTile,
     &kHorizontalTabSwitcherAndroid,
+    &kIdentityDisc,
     &kImmersiveUiMode,
     &kImprovedA2HS,
     &kInlineUpdateFlow,
@@ -407,6 +408,9 @@
 const base::Feature kHorizontalTabSwitcherAndroid{
     "HorizontalTabSwitcherAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kIdentityDisc{"IdentityDisc",
+                                  base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Makes "Add to Home screen" in the app menu generate an APK for the shortcut
 // URL which opens Chrome in fullscreen.
 // This feature is kept around so that we have a kill-switch in case of server
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 515e35c..1118d7c 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -72,6 +72,7 @@
 extern const base::Feature kHomePageButtonForceEnabled;
 extern const base::Feature kHomepageTile;
 extern const base::Feature kHorizontalTabSwitcherAndroid;
+extern const base::Feature kIdentityDisc;
 extern const base::Feature kImmersiveUiMode;
 extern const base::Feature kImprovedA2HS;
 extern const base::Feature kInlineUpdateFlow;
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 3b4902bf..cd555b0 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -83,6 +83,8 @@
         <include name="IDR_BROWSER_SWITCHER_BROWSER_SWITCHER_PROXY_HTML" file="resources\browser_switcher\browser_switcher_proxy.html" compress="gzip" allowexternalscript="true" type="BINDATA" />
         <include name="IDR_BROWSER_SWITCHER_BROWSER_SWITCHER_PROXY_JS" file="resources\browser_switcher\browser_switcher_proxy.js" compress="gzip" type="BINDATA" />
         <include name="IDR_BROWSER_SWITCHER_BROWSER_SWITCH_HTML" file="resources\browser_switcher\browser_switcher.html" compress="gzip" allowexternalscript="true" type="BINDATA" />
+        <include name="IDR_BROWSER_SWITCHER_INTERNALS_HTML" file="resources\browser_switcher\internals\browser_switcher_internals.html" compress="gzip" allowexternalscript="true" type="BINDATA" />
+        <include name="IDR_BROWSER_SWITCHER_INTERNALS_JS" file="resources\browser_switcher\internals\browser_switcher_internals.js" compress="gzip" type="BINDATA" />
       </if>
       <if expr="is_win">
         <include name="IDR_ABOUT_CONFLICTS_HTML" file="resources\conflicts\about_conflicts.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d2b8ae487..c5b8794 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -320,6 +320,8 @@
 #include "media/media_buildflags.h"
 #include "media/mojo/buildflags.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
 #include "net/base/load_flags.h"
 #include "net/base/mime_util.h"
@@ -1455,16 +1457,15 @@
   for (size_t i = 0; i < extra_parts_.size(); ++i)
     extra_parts_[i]->RenderProcessWillLaunch(host);
 
-  service_manager::mojom::ServicePtr service;
-  *service_request = mojo::MakeRequest(&service);
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
+  mojo::PendingRemote<service_manager::mojom::Service> service;
+  *service_request = service.InitWithNewPipeAndPassReceiver();
   service_manager::Identity renderer_identity = host->GetChildIdentity();
   ChromeService::GetInstance()->connector()->RegisterServiceInstance(
       service_manager::Identity(chrome::mojom::kRendererServiceName,
                                 renderer_identity.instance_group(),
                                 renderer_identity.instance_id(),
                                 base::Token::CreateRandom()),
-      std::move(service), mojo::MakeRequest(&pid_receiver));
+      std::move(service), mojo::NullReceiver() /* metadata_receiver */);
 }
 
 GURL ChromeContentBrowserClient::GetEffectiveURL(
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog.cc b/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog.cc
index e98e4f5..afa56f4b 100644
--- a/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog.cc
+++ b/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog.cc
@@ -474,11 +474,11 @@
     return;
 
   browser->window()->SetIntentPickerViewVisibility(/*visible=*/true);
+  const bool stay_in_chrome = IsChromeAnAppCandidate(handlers);
   browser->window()->ShowIntentPickerBubble(
-      std::move(app_info), IsChromeAnAppCandidate(handlers),
-      /*show_remember_selection=*/true,
-      base::Bind(OnIntentPickerClosed, render_process_host_id, routing_id, url,
-                 safe_to_bypass_ui, base::Passed(&handlers)));
+      std::move(app_info), stay_in_chrome, /*show_remember_selection=*/true,
+      base::BindOnce(OnIntentPickerClosed, render_process_host_id, routing_id,
+                     url, safe_to_bypass_ui, std::move(handlers)));
 }
 
 // Called when ARC returned a handler list for the |url|.
diff --git a/chrome/browser/chromeos/arc/print/arc_print_service.cc b/chrome/browser/chromeos/arc/print/arc_print_service.cc
index d65c593..ce039a3 100644
--- a/chrome/browser/chromeos/arc/print/arc_print_service.cc
+++ b/chrome/browser/chromeos/arc/print/arc_print_service.cc
@@ -255,7 +255,7 @@
       return;
     }
     if (printers_manager_->IsPrinterInstalled(*printer)) {
-      PrinterInstalled(*printer, chromeos::kSuccess);
+      FetchCapabilities(*printer);
       return;
     }
     configurer_->SetUpPrinter(
@@ -297,10 +297,13 @@
       return;
     }
     printers_manager_->PrinterInstalled(printer, true /*is_automatic*/);
-    const std::string& printer_id = printer.id();
+    FetchCapabilities(printer);
+  }
+
+  void FetchCapabilities(const chromeos::Printer& printer) {
     base::PostTaskWithTraitsAndReplyWithResult(
         FROM_HERE, {base::MayBlock()},
-        base::BindOnce(&FetchCapabilitiesOnBlockingTaskRunner, printer_id),
+        base::BindOnce(&FetchCapabilitiesOnBlockingTaskRunner, printer.id()),
         base::BindOnce(&PrinterDiscoverySessionHostImpl::CapabilitiesReceived,
                        weak_ptr_factory_.GetWeakPtr(), printer));
   }
diff --git a/chrome/browser/chromeos/attestation/machine_certificate_uploader.cc b/chrome/browser/chromeos/attestation/machine_certificate_uploader.cc
index 1ea7baa..83b9fe6 100644
--- a/chrome/browser/chromeos/attestation/machine_certificate_uploader.cc
+++ b/chrome/browser/chromeos/attestation/machine_certificate_uploader.cc
@@ -269,7 +269,9 @@
   // Get the payload and check if the certificate has already been uploaded.
   GetKeyPayload(
       base::BindRepeating(&MachineCertificateUploader::CheckIfUploaded,
-                          weak_factory_.GetWeakPtr(), pem_certificate_chain));
+                          weak_factory_.GetWeakPtr(), pem_certificate_chain),
+      base::BindRepeating(&MachineCertificateUploader::Reschedule,
+                          weak_factory_.GetWeakPtr()));
 }
 
 void MachineCertificateUploader::UploadCertificate(
@@ -293,16 +295,13 @@
 }
 
 void MachineCertificateUploader::GetKeyPayload(
-    base::RepeatingCallback<void(const std::string&)> callback) {
+    base::RepeatingCallback<void(const std::string&)> callback,
+    base::RepeatingCallback<void()> on_failure) {
   cryptohome_client_->TpmAttestationGetKeyPayload(
       KEY_DEVICE,
       cryptohome::AccountIdentifier(),  // Not used.
       kEnterpriseMachineKey,
-      base::BindRepeating(
-          DBusStringCallback, callback,
-          base::BindRepeating(&MachineCertificateUploader::Reschedule,
-                              weak_factory_.GetWeakPtr()),
-          FROM_HERE));
+      base::BindRepeating(DBusStringCallback, callback, on_failure, FROM_HERE));
 }
 
 void MachineCertificateUploader::OnUploadComplete(bool status) {
@@ -310,7 +309,8 @@
     VLOG(1) << "Enterprise Machine Certificate uploaded to DMServer.";
     GetKeyPayload(
         base::BindRepeating(&MachineCertificateUploader::MarkAsUploaded,
-                            weak_factory_.GetWeakPtr()));
+                            weak_factory_.GetWeakPtr()),
+        base::DoNothing());
   }
   std::move(callback_).Run(status);
 }
diff --git a/chrome/browser/chromeos/attestation/machine_certificate_uploader.h b/chrome/browser/chromeos/attestation/machine_certificate_uploader.h
index cbb94214..c778eb1 100644
--- a/chrome/browser/chromeos/attestation/machine_certificate_uploader.h
+++ b/chrome/browser/chromeos/attestation/machine_certificate_uploader.h
@@ -72,9 +72,10 @@
   void CheckIfUploaded(const std::string& pem_certificate_chain,
                        const std::string& key_payload);
 
-  // Gets the payload associated with the EMK and sends it to |callback|.
-  void GetKeyPayload(
-      base::RepeatingCallback<void(const std::string&)> callback);
+  // Gets the payload associated with the EMK and sends it to |callback|,
+  // or call |on_failure| with no arguments if the payload cannot be obtained.
+  void GetKeyPayload(base::RepeatingCallback<void(const std::string&)> callback,
+                     base::RepeatingCallback<void()> on_failure);
 
   // Called when a certificate upload operation completes.  On success, |status|
   // will be true.
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 1f36755..dea49d8d 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1258,7 +1258,7 @@
   }
   auto printers_manager = chromeos::CupsPrintersManager::Create(
       Profile::FromBrowserContext(browser_context()));
-  printers_manager->UpdateSavedPrinter(printer);
+  printers_manager->SavePrinter(printer);
   return RespondNow(NoArguments());
 }
 
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.cc
index 0a2cfc6..45f7ef06 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_factory.cc
@@ -30,23 +30,6 @@
 
 namespace {
 
-// Gets the file path from which easy unlock app should be loaded.
-base::FilePath GetEasyUnlockAppPath() {
-#if defined(GOOGLE_CHROME_BUILD)
-#ifndef NDEBUG
-  // Only allow app path override switch for debug build.
-  const base::CommandLine* command_line =
-      base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kEasyUnlockAppPath))
-    return command_line->GetSwitchValuePath(switches::kEasyUnlockAppPath);
-#endif  // !defined(NDEBUG)
-
-  return base::FilePath("/usr/share/chromeos-assets/easy_unlock");
-#endif  // defined(GOOGLE_CHROME_BUILD)
-
-  return base::FilePath();
-}
-
 bool IsFeatureAllowed(content::BrowserContext* context) {
   return multidevice_setup::IsFeatureAllowed(
       multidevice_setup::mojom::Feature::kSmartLock,
@@ -113,10 +96,6 @@
             Profile::FromBrowserContext(context)));
   }
 
-  const base::FilePath app_path = app_path_for_testing_.empty()
-                                      ? GetEasyUnlockAppPath()
-                                      : app_path_for_testing_;
-
   service->Initialize();
   return service;
 }
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc
index 8bd8291..9211aef 100644
--- a/chrome/browser/chromeos/login/lock/screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -9,7 +9,6 @@
 
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/interfaces/constants.mojom.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
index 8a8b1100..a3965e61 100644
--- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -12,8 +12,7 @@
 #include <vector>
 
 #include "ash/public/cpp/ash_pref_names.h"
-#include "ash/public/interfaces/constants.mojom.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
+#include "ash/public/cpp/session/session_controller.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
@@ -99,9 +98,7 @@
 #include "components/user_manager/user_type.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
-#include "content/public/common/service_manager_connection.h"
 #include "extensions/browser/device_local_account_util.h"
-#include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
@@ -1413,11 +1410,8 @@
 void ChromeUserManagerImpl::OnUserNotAllowed(const std::string& user_email) {
   LOG(ERROR) << "Shutdown session because a user is not allowed to be in the "
                 "current session";
-  ash::mojom::SessionControllerPtr session_controller;
-  content::ServiceManagerConnection::GetForProcess()
-      ->GetConnector()
-      ->BindInterface(ash::mojom::kServiceName, &session_controller);
-  session_controller->ShowMultiprofilesSessionAbortedDialog(user_email);
+  ash::SessionController::Get()->ShowMultiprofilesSessionAbortedDialog(
+      user_email);
   chrome::RecordDialogCreation(
       chrome::DialogIdentifier::MULTIPROFILES_SESSION_ABORTED);
 }
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager.cc b/chrome/browser/chromeos/printing/cups_printers_manager.cc
index 07c00f0..58755e46 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager.cc
@@ -114,15 +114,13 @@
   }
 
   // Public API function.
-  void UpdateSavedPrinter(const Printer& printer) override {
+  void SavePrinter(const Printer& printer) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_);
     if (!native_printers_allowed_.GetValue()) {
-      LOG(WARNING) << "UpdateSavedPrinter() called when "
+      LOG(WARNING) << "SavePrinter() called when "
                       "UserNativePrintersAllowed is set to false";
       return;
     }
-    // If this is an 'add' instead of just an update, record the event.
-    MaybeRecordInstallation(printer, false /* is_automatic_installation */);
     synced_printers_manager_->UpdateSavedPrinter(printer);
     // Note that we will rebuild our lists when we get the observer
     // callback from |synced_printers_manager_|.
@@ -165,8 +163,6 @@
     }
     MaybeRecordInstallation(printer, is_automatic);
     MarkPrinterInstalledWithCups(printer);
-
-    synced_printers_manager_->UpdateSavedPrinter(printer);
   }
 
   // Public API function.
@@ -322,9 +318,9 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_);
     for (const PrinterDetector::DetectedPrinter& detected : detected_list) {
       const std::string& detected_printer_id = detected.printer.id();
-      if (printers_.Get(PrinterClass::kSaved, detected_printer_id)) {
-        // It's already in the configured class, don't need to do anything
-        // else here.
+      if (printers_.IsPrinterInClass(PrinterClass::kSaved,
+                                     detected_printer_id)) {
+        // It's already in the saved class, don't need to do anything else here.
         continue;
       }
 
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager.h b/chrome/browser/chromeos/printing/cups_printers_manager.h
index 69e89f8..16a6cb0 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager.h
+++ b/chrome/browser/chromeos/printing/cups_printers_manager.h
@@ -67,11 +67,9 @@
   virtual std::vector<Printer> GetPrinters(
       PrinterClass printer_class) const = 0;
 
-  // Update or save a printer as a saved printer.  If this is the same as
-  // an existing saved printer, the entry will be updated.  If the printer
-  // appears in a class other than saved, it will be moved to the
-  // saved class.
-  virtual void UpdateSavedPrinter(const Printer& printer) = 0;
+  // Saves |printer|. If |printer| already exists in the saved class, it will
+  // be overwritten.
+  virtual void SavePrinter(const Printer& printer) = 0;
 
   // Remove the saved printer with the given id.  This is a NOP if
   // the printer_id is not that of a saved printer.
@@ -83,9 +81,7 @@
   virtual void AddObserver(Observer* observer) = 0;
   virtual void RemoveObserver(Observer* observer) = 0;
 
-  // Record that the given printers has been installed in CUPS for usage.  If
-  // |printer| is not a saved or enterprise printer, this will have the
-  // side effect of moving |printer| into the saved class.
+  // Record that the given printers has been installed in CUPS for usage.
   // Parameter |is_automatic| should be set to true if the printer was
   // saved automatically (without requesting additional information
   // from the user).
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
index e1b6ef1..844b5272 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -200,6 +200,7 @@
                        });
 
     detections_.resize(new_end - detections_.begin());
+    on_printers_found_callback_.Run(detections_);
   }
 
  private:
@@ -426,8 +427,10 @@
   // classes.
   manager_->PrinterInstalled(Printer("DiscoveredPrinter0"),
                              true /* is_automatic */);
+  manager_->SavePrinter(Printer("DiscoveredPrinter0"));
   manager_->PrinterInstalled(Printer("AutomaticPrinter0"),
                              true /* is_automatic */);
+  manager_->SavePrinter(Printer("AutomaticPrinter0"));
   scoped_task_environment_.RunUntilIdle();
   ExpectPrintersInClassAre(PrinterClass::kDiscovered, {"DiscoveredPrinter1"});
   ExpectPrintersInClassAre(PrinterClass::kAutomatic, {"AutomaticPrinter1"});
@@ -439,7 +442,7 @@
 // should propagate.  Updates of printers in other classes should result in
 // those printers becoming saved.  Updates of unknown printers should
 // result in a new saved printer.
-TEST_F(CupsPrintersManagerTest, UpdateSavedPrinter) {
+TEST_F(CupsPrintersManagerTest, SavePrinter) {
   // Start with a printer in each class named after the class it's in, except
   // Enterprise which is not relevant to this test.
   Printer existing_saved("Saved");
@@ -456,7 +459,7 @@
   // Update the existing saved printer.  Check that the new display name
   // propagated.
   existing_saved.set_display_name("New Display Name");
-  manager_->UpdateSavedPrinter(existing_saved);
+  manager_->SavePrinter(existing_saved);
   scoped_task_environment_.RunUntilIdle();
   ExpectPrintersInClassAre(PrinterClass::kSaved, {"Saved"});
   EXPECT_EQ(manager_->GetPrinters(PrinterClass::kSaved)[0].display_name(),
@@ -465,19 +468,19 @@
   // Do the same thing for the Automatic and Discovered printers.
   // Create a configuration for the zeroconf printer, which should shift it
   // into the saved category.
-  manager_->PrinterInstalled(Printer("Automatic"), true /* is_automatic */);
+  manager_->SavePrinter(Printer("Automatic"));
   scoped_task_environment_.RunUntilIdle();
   ExpectPrintersInClassAre(PrinterClass::kAutomatic, {});
   ExpectPrintersInClassAre(PrinterClass::kSaved, {"Automatic", "Saved"});
 
-  manager_->PrinterInstalled(Printer("Discovered"), true /* is_automatic */);
+  manager_->SavePrinter(Printer("Discovered"));
   scoped_task_environment_.RunUntilIdle();
   ExpectPrintersInClassAre(PrinterClass::kDiscovered, {});
   ExpectPrintersInClassAre(PrinterClass::kSaved,
                            {"Automatic", "Saved", "Discovered"});
 
-  // Update a printer we haven't seen before, which should just add it.
-  manager_->PrinterInstalled(Printer("NewFangled"), true /* is_automatic */);
+  // Save a printer we haven't seen before, which should just add it to kSaved.
+  manager_->SavePrinter(Printer("NewFangled"));
   scoped_task_environment_.RunUntilIdle();
   ExpectPrintersInClassAre(PrinterClass::kSaved,
                            {"Automatic", "Saved", "Discovered", "NewFangled"});
@@ -534,8 +537,8 @@
 }
 
 // Test that if |UserNativePrintersAllowed| pref is set to false, then
-// UpdateSavedPrinter() will simply do nothing.
-TEST_F(CupsPrintersManagerTest, UpdateSavedPrinterUserNativePrintersDisabled) {
+// SavePrinter() will simply do nothing.
+TEST_F(CupsPrintersManagerTest, SavePrinterUserNativePrintersDisabled) {
   // Start by installing a saved printer to be used to test than any
   // changes made to the printer will not be propogated.
   Printer existing_saved("Saved");
@@ -555,7 +558,7 @@
   // Update the existing saved printer. Verify that the changes did not
   // progogate.
   existing_saved.set_display_name("New Display Name");
-  manager_->UpdateSavedPrinter(existing_saved);
+  manager_->SavePrinter(existing_saved);
   scoped_task_environment_.RunUntilIdle();
 
   // Reenable user printers in order to do checking.
@@ -566,14 +569,14 @@
 
   // Attempt to update the Automatic and Discovered printers. In both cases
   // check that the printers do not move into the saved category.
-  manager_->UpdateSavedPrinter(Printer("Automatic"));
+  manager_->SavePrinter(Printer("Automatic"));
   scoped_task_environment_.RunUntilIdle();
   UpdatePolicyValue(prefs::kUserNativePrintersAllowed, true);
   ExpectPrintersInClassAre(PrinterClass::kAutomatic, {"Automatic"});
   ExpectPrintersInClassAre(PrinterClass::kSaved, {"Saved"});
   UpdatePolicyValue(prefs::kUserNativePrintersAllowed, false);
 
-  manager_->UpdateSavedPrinter(Printer("Discovered"));
+  manager_->SavePrinter(Printer("Discovered"));
   scoped_task_environment_.RunUntilIdle();
   UpdatePolicyValue(prefs::kUserNativePrintersAllowed, true);
   ExpectPrintersInClassAre(PrinterClass::kDiscovered, {"Discovered"});
@@ -582,7 +585,7 @@
 
   // Attempt to update a printer that we haven't seen before, check that nothing
   // changed.
-  manager_->UpdateSavedPrinter(Printer("NewFangled"));
+  manager_->SavePrinter(Printer("NewFangled"));
   scoped_task_environment_.RunUntilIdle();
   UpdatePolicyValue(prefs::kUserNativePrintersAllowed, true);
   ExpectPrintersInClassAre(PrinterClass::kSaved, {"Saved"});
@@ -676,24 +679,46 @@
   EXPECT_TRUE(manager_->IsPrinterInstalled(printer));
 }
 
-// Test that calling PrinterInstalled when printer configuration change updates
-// the saved printer.
-TEST_F(CupsPrintersManagerTest,
-       PrinterInstalledUpdatesPreviouslyInstalledPrinter) {
+// Test that we can save non-discovered printers.
+TEST_F(CupsPrintersManagerTest, SavePrinterSucceedsOnManualPrinter) {
+  Printer printer(kPrinterId);
+  printer.set_uri("manual uri");
+  manager_->SavePrinter(printer);
+
+  auto saved_printers = manager_->GetPrinters(PrinterClass::kSaved);
+  ASSERT_EQ(1u, saved_printers.size());
+  EXPECT_EQ(printer.uri(), saved_printers[0].uri());
+}
+
+// Test that installing a printer does not put it in the saved class.
+TEST_F(CupsPrintersManagerTest, PrinterInstalledDoesNotSavePrinter) {
   Printer printer(kPrinterId);
   manager_->PrinterInstalled(printer, false /* is_automatic */);
+
+  auto saved_printers = manager_->GetPrinters(PrinterClass::kSaved);
+  EXPECT_EQ(0u, saved_printers.size());
+}
+
+// Test that calling SavePrinter() when printer configuration change updates
+// the saved printer but does not install the updated printer.
+TEST_F(CupsPrintersManagerTest, SavePrinterUpdatesPreviouslyInstalledPrinter) {
+  Printer printer(kPrinterId);
+  manager_->PrinterInstalled(printer, false /* is_automatic */);
+  manager_->SavePrinter(printer);
   EXPECT_TRUE(manager_->IsPrinterInstalled(printer));
 
   Printer updated(printer);
   updated.set_uri("different value");
   EXPECT_FALSE(manager_->IsPrinterInstalled(updated));
 
-  manager_->PrinterInstalled(updated, false /* is_automatic */);
-
-  // The printer in saved should have the new uri, not the old uri.
+  manager_->SavePrinter(updated);
   auto saved_printers = manager_->GetPrinters(PrinterClass::kSaved);
-  EXPECT_EQ(1u, saved_printers.size());
+  ASSERT_EQ(1u, saved_printers.size());
   EXPECT_EQ(updated.uri(), saved_printers[0].uri());
+
+  // Even though the updated printer was saved, it still needs to be marked as
+  // installed again.
+  EXPECT_FALSE(manager_->IsPrinterInstalled(updated));
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/printing/printers_map.h b/chrome/browser/chromeos/printing/printers_map.h
index b1dd467..5eba874 100644
--- a/chrome/browser/chromeos/printing/printers_map.h
+++ b/chrome/browser/chromeos/printing/printers_map.h
@@ -56,14 +56,14 @@
   // |printer_id| doesn't exist in printer_class.
   void Remove(PrinterClass printer_class, const std::string& printer_id);
 
- private:
-  // Returns true if |printer_class| exists and contains at least 1 printer.
-  bool HasPrintersInClass(PrinterClass printer_class) const;
-
   // Returns true if the printer |printer_id| exists in |printer_class|.
   bool IsPrinterInClass(PrinterClass printer_class,
                         const std::string& printer_id) const;
 
+ private:
+  // Returns true if |printer_class| exists and contains at least 1 printer.
+  bool HasPrintersInClass(PrinterClass printer_class) const;
+
   // Returns true if |printer_id| exists in any class. Used only for DCHECKs.
   bool IsExistingPrinter(const std::string& printer_id) const;
 
diff --git a/chrome/browser/chromeos/printing/printers_map_unittest.cc b/chrome/browser/chromeos/printing/printers_map_unittest.cc
index f01c7c3..1d6d46b 100644
--- a/chrome/browser/chromeos/printing/printers_map_unittest.cc
+++ b/chrome/browser/chromeos/printing/printers_map_unittest.cc
@@ -343,4 +343,22 @@
   EXPECT_TRUE(printers_map.Get(printer_id));
 }
 
+TEST_F(PrintersMapTest, IsPrinterInClass) {
+  PrintersMap printers_map;
+
+  const std::string printer_id = "id";
+
+  // Returns false for non-existent printers.
+  EXPECT_FALSE(
+      printers_map.IsPrinterInClass(PrinterClass::kEnterprise, "random_id"));
+
+  // Add an enterprise printer. It can be found as an enterprise printer, but
+  // not as a discovered printer.
+  printers_map.Insert(PrinterClass::kEnterprise, Printer(printer_id));
+  EXPECT_TRUE(
+      printers_map.IsPrinterInClass(PrinterClass::kEnterprise, printer_id));
+  EXPECT_FALSE(
+      printers_map.IsPrinterInClass(PrinterClass::kDiscovered, printer_id));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/download/download_manager_utils.cc b/chrome/browser/download/download_manager_utils.cc
index 8164615..7f696829 100644
--- a/chrome/browser/download/download_manager_utils.cc
+++ b/chrome/browser/download/download_manager_utils.cc
@@ -6,11 +6,8 @@
 
 #include "base/bind.h"
 #include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/transition_manager/full_browser_transition_manager.h"
 #include "components/download/public/common/in_progress_download_manager.h"
-#include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_request_utils.h"
 
 #if defined(OS_ANDROID)
@@ -23,16 +20,6 @@
 bool IgnoreOriginSecurityCheck(const GURL& url) {
   return true;
 }
-
-// Some ChromeOS browser tests doesn't initialize DownloadManager when profile
-// is created, and cause the download request to fail. This method helps us
-// ensure that the DownloadManager will be created after profile creation.
-void GetDownloadManagerOnProfileCreation(Profile* profile) {
-  content::DownloadManager* manager =
-      content::BrowserContext::GetDownloadManager(profile);
-  DCHECK(manager);
-}
-
 }  // namespace
 
 download::InProgressDownloadManager*
@@ -52,15 +39,3 @@
       base::BindRepeating(&IgnoreOriginSecurityCheck),
       base::BindRepeating(&content::DownloadRequestUtils::IsURLSafe));
 }
-
-void DownloadManagerUtils::InitializeSimpleDownloadManager(
-    SimpleFactoryKey* key) {
-#if defined(OS_ANDROID)
-  if (!g_browser_process) {
-    DownloadManagerService::GetInstance()->CreateInProgressDownloadManager();
-    return;
-  }
-#endif
-  FullBrowserTransitionManager::Get()->RegisterCallbackOnProfileCreation(
-      key, base::BindOnce(&GetDownloadManagerOnProfileCreation));
-}
diff --git a/chrome/browser/download/download_manager_utils.h b/chrome/browser/download/download_manager_utils.h
index 68623c7c..460b66a 100644
--- a/chrome/browser/download/download_manager_utils.h
+++ b/chrome/browser/download/download_manager_utils.h
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 
 class Profile;
-class SimpleFactoryKey;
 
 namespace download {
 class InProgressDownloadManager;
@@ -19,11 +18,6 @@
   // Creates an InProgressDownloadManager from a profile.
   static download::InProgressDownloadManager* RetrieveInProgressDownloadManager(
       Profile* profile);
-
-  // Initializes the SimpleDownloadManager that is associated with |key| whenver
-  // possible.
-  static void InitializeSimpleDownloadManager(SimpleFactoryKey* key);
-
  private:
   DISALLOW_COPY_AND_ASSIGN(DownloadManagerUtils);
 };
diff --git a/chrome/browser/download/download_service_factory.cc b/chrome/browser/download/download_service_factory.cc
index 75be1500..d0e92416 100644
--- a/chrome/browser/download/download_service_factory.cc
+++ b/chrome/browser/download/download_service_factory.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/background_fetch/background_fetch_download_client.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h"
 #include "chrome/browser/download/deferred_client_wrapper.h"
-#include "chrome/browser/download/download_manager_utils.h"
 #include "chrome/browser/download/download_task_scheduler_impl.h"
 #include "chrome/browser/download/simple_download_manager_coordinator_factory.h"
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -61,6 +60,9 @@
 #if defined(CHROMEOS)
 std::unique_ptr<download::Client> CreatePluginVmImageDownloadClient(
     Profile* profile) {
+  content::DownloadManager* manager =
+      content::BrowserContext::GetDownloadManager(profile);
+  DCHECK(manager);
   return std::make_unique<plugin_vm::PluginVmImageDownloadClient>(profile);
 }
 #endif
@@ -189,12 +191,6 @@
 #else
     task_scheduler = std::make_unique<DownloadTaskSchedulerImpl>(context);
 #endif
-    // Some tests doesn't initialize DownloadManager when profile is created,
-    // and cause the download service to fail. Call
-    // InitializeSimpleDownloadManager() to initialize the DownloadManager
-    // whenever profile becomes available.
-    DownloadManagerUtils::InitializeSimpleDownloadManager(
-        profile->GetProfileKey());
     return download::BuildDownloadService(
                profile->GetProfileKey(), profile->GetPrefs(),
                std::move(clients), content::GetNetworkConnectionTracker(),
diff --git a/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc b/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
index 0c631b3..8f148a77 100644
--- a/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
+++ b/chrome/browser/extensions/api/file_system/chrome_file_system_delegate.cc
@@ -184,7 +184,7 @@
       content::ChildProcessSecurityPolicy::GetInstance();
   DCHECK(policy);
 
-  const auto process_id = requester->render_frame_host()->GetProcess()->GetID();
+  const auto process_id = requester->source_process_id();
   // Read-only permisisons.
   policy->GrantReadFile(process_id, volume->mount_path());
   policy->GrantReadFileSystem(process_id, file_system_id);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5c156231..f77b22f 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1173,6 +1173,11 @@
     "expiry_milestone": 80
   },
   {
+    "name": "identity-disc",
+    "owners": ["//chrome/android/java/src/org/chromium/chrome/browser/toolbar/OWNERS"],
+    "expiry_milestone": 78
+  },
+  {
     "name": "enable-implicit-root-scroller",
     "owners": [ "bokan", "input-dev" ],
     "expiry_milestone": 75
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index f3a7941..8202b61 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2323,6 +2323,10 @@
     "When NTPButton is enabled, the first tile of the Suggested Tiles will be "
     "used for homepage. It will not have an effect when NTPButton is disabled.";
 
+const char kIdentityDiscName[] = "Identity Disc";
+const char kIdentityDiscDescription[] =
+    "Enables Identity Disc, profile avatar icon button in toolbar.";
+
 const char kIncognitoStringsName[] = "Alternate incognito strings";
 const char kIncognitoStringsDescription[] =
     "Show alternate incognito strings if enabled.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 000d375..c357d8d 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1396,6 +1396,9 @@
 extern const char kHomepageTileName[];
 extern const char kHomepageTileDescription[];
 
+extern const char kIdentityDiscName[];
+extern const char kIdentityDiscDescription[];
+
 extern const char kIncognitoStringsName[];
 extern const char kIncognitoStringsDescription[];
 
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 689ab63..469ceb9ec 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -479,6 +479,7 @@
 
 void ChromePasswordManagerClient::CheckProtectedPasswordEntry(
     PasswordType reused_password_type,
+    const std::string& username,
     const std::vector<std::string>& matching_domains,
     bool password_field_exists) {
   safe_browsing::PasswordProtectionService* pps =
@@ -486,7 +487,7 @@
   if (!pps)
     return;
   pps->MaybeStartProtectedPasswordEntryRequest(
-      web_contents(), GetMainFrameURL(),
+      web_contents(), GetMainFrameURL(), username,
       safe_browsing::PasswordProtectionService::
           GetPasswordProtectionReusedPasswordType(reused_password_type),
       matching_domains, password_field_exists);
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 8412087..8e459461 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -150,6 +150,7 @@
 
   void CheckProtectedPasswordEntry(
       password_manager::metrics_util::PasswordType reused_password_type,
+      const std::string& username,
       const std::vector<std::string>& matching_domains,
       bool password_field_exists) override;
 
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index 09a277b..f6abf5f5 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -689,21 +689,22 @@
   std::unique_ptr<MockChromePasswordManagerClient> client(
       new MockChromePasswordManagerClient(test_web_contents.get()));
 
-  EXPECT_CALL(*client->password_protection_service(),
-              MaybeStartProtectedPasswordEntryRequest(_, _, _, _, true))
+  EXPECT_CALL(
+      *client->password_protection_service(),
+      MaybeStartProtectedPasswordEntryRequest(_, _, "username", _, _, true))
       .Times(4);
   client->CheckProtectedPasswordEntry(
-      password_manager::metrics_util::PasswordType::SAVED_PASSWORD,
+      password_manager::metrics_util::PasswordType::SAVED_PASSWORD, "username",
       std::vector<std::string>({"saved_domain.com"}), true);
   client->CheckProtectedPasswordEntry(
-      password_manager::metrics_util::PasswordType::SYNC_PASSWORD,
+      password_manager::metrics_util::PasswordType::SYNC_PASSWORD, "username",
       std::vector<std::string>({"saved_domain.com"}), true);
   client->CheckProtectedPasswordEntry(
       password_manager::metrics_util::PasswordType::OTHER_GAIA_PASSWORD,
-      std::vector<std::string>({"saved_domain.com"}), true);
+      "username", std::vector<std::string>({"saved_domain.com"}), true);
   client->CheckProtectedPasswordEntry(
       password_manager::metrics_util::PasswordType::ENTERPRISE_PASSWORD,
-      std::vector<std::string>({"saved_domain.com"}), true);
+      "username", std::vector<std::string>({"saved_domain.com"}), true);
 }
 
 TEST_F(ChromePasswordManagerClientTest, VerifyLogPasswordReuseDetectedEvent) {
diff --git a/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc b/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
index e0a2801..67e37ae3 100644
--- a/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
+++ b/chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.cc
@@ -34,10 +34,9 @@
   DCHECK(performance_manager);
 
   performance_manager->task_runner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&performance_manager::ProcessNodeImpl::AddBinding,
-                     base::Unretained(user_data->process_node()),
-                     std::move(request)));
+      FROM_HERE, base::BindOnce(&performance_manager::ProcessNodeImpl::Bind,
+                                base::Unretained(user_data->process_node()),
+                                std::move(request)));
 }
 
 }  // namespace
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.cc b/chrome/browser/performance_manager/graph/frame_node_impl.cc
index 3db2aad..b785bb8 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.cc
@@ -18,7 +18,8 @@
                              FrameNodeImpl* parent_frame_node,
                              int frame_tree_node_id,
                              const base::UnguessableToken& dev_tools_token)
-    : CoordinationUnitInterface(graph),
+    : TypedNodeBase(graph),
+      binding_(this),
       parent_frame_node_(parent_frame_node),
       page_node_(page_node),
       process_node_(process_node),
@@ -33,6 +34,20 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+void FrameNodeImpl::Bind(
+    resource_coordinator::mojom::DocumentCoordinationUnitRequest request) {
+  // It is possible to receive a DocumentCoordinationUnitRequest when |binding_|
+  // is already bound in these cases:
+  // - Navigation from the initial empty document to the first real document.
+  // - Navigation rejected by RenderFrameHostImpl::ValidateDidCommitParams().
+  // See discussion:
+  // https://chromium-review.googlesource.com/c/chromium/src/+/1572459/6#message-bd31f3e73f96bd9f7721be81ba6ac0076d053147
+  if (binding_.is_bound())
+    binding_.Close();
+
+  binding_.Bind(std::move(request));
+}
+
 void FrameNodeImpl::SetNetworkAlmostIdle(bool network_almost_idle) {
   network_almost_idle_.SetAndMaybeNotify(this, network_almost_idle);
 }
@@ -140,11 +155,6 @@
   return is_ad_frame_;
 }
 
-void FrameNodeImpl::set_url(const GURL& url) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  url_ = url;
-}
-
 void FrameNodeImpl::SetIsCurrent(bool is_current) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   is_current_.SetAndMaybeNotify(this, is_current);
@@ -176,6 +186,38 @@
   return !parent_frame_node_;
 }
 
+void FrameNodeImpl::OnNavigationCommitted(const GURL& url, bool same_document) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  url_ = url;
+
+  if (same_document)
+    return;
+
+  // Close |binding_| to ensure that messages queued by the previous document
+  // before the navigation commit are dropped.
+  //
+  // Note: It is guaranteed that |binding_| isn't yet bound to the new document.
+  //       This is important because it would be incorrect to close the new
+  //       document's binding.
+  //
+  //       Renderer: blink::DocumentLoader::DidCommitNavigation
+  //                   ... content::RenderFrameImpl::DidCommitProvisionalLoad
+  //                     ... mojom::FrameHost::DidCommitProvisionalLoad
+  //       Browser:  RenderFrameHostImpl::DidCommitNavigation
+  //                   Bind the new document's interface provider [A]
+  //                   PMTabHelper::DidFinishNavigation
+  //                     (async) FrameNodeImpl::OnNavigationCommitted [B]
+  //       Renderer: Request DocumentCoordinationUnit interface
+  //       Browser:  PMTabHelper::OnInterfaceRequestFromFrame [C]
+  //                   (async) FrameNodeImpl::Bind [D]
+  //
+  //       A happens before C, because no interface request can be processed
+  //       before the interface provider is bound. A posts B to PM sequence and
+  //       C posts D to PM sequence, therefore B happens before D.
+  binding_.Close();
+}
+
 bool FrameNodeImpl::AreAllInterventionPoliciesSet() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // The convention is that policies are first set en masse, in order. So if
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.h b/chrome/browser/performance_manager/graph/frame_node_impl.h
index 839cf0f..67222ce 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.h
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.h
@@ -44,10 +44,8 @@
 // active frame.
 class FrameNodeImpl
     : public PublicNodeImpl<FrameNodeImpl, FrameNode>,
-      public CoordinationUnitInterface<
-          FrameNodeImpl,
-          resource_coordinator::mojom::DocumentCoordinationUnit,
-          resource_coordinator::mojom::DocumentCoordinationUnitRequest> {
+      public TypedNodeBase<FrameNodeImpl>,
+      public resource_coordinator::mojom::DocumentCoordinationUnit {
  public:
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kFrame; }
 
@@ -62,6 +60,9 @@
                 const base::UnguessableToken& dev_tools_token);
   ~FrameNodeImpl() override;
 
+  void Bind(
+      resource_coordinator::mojom::DocumentCoordinationUnitRequest request);
+
   // resource_coordinator::mojom::DocumentCoordinationUnit implementation.
   void SetNetworkAlmostIdle(bool idle) override;
   void SetLifecycleState(
@@ -90,13 +91,15 @@
   bool is_ad_frame() const;
 
   // Setters are not thread safe.
-  void set_url(const GURL& url);
   void SetIsCurrent(bool is_current);
 
   // A frame is a main frame if it has no |parent_frame_node|. This can be
   // called from any thread.
   bool IsMainFrame() const;
 
+  // Invoked when a navigation is committed in the frame.
+  void OnNavigationCommitted(const GURL& url, bool same_document);
+
   // Returns true if all intervention policies have been set for this frame.
   bool AreAllInterventionPoliciesSet() const;
 
@@ -119,6 +122,8 @@
   bool HasFrameNodeInAncestors(FrameNodeImpl* frame_node) const;
   bool HasFrameNodeInDescendants(FrameNodeImpl* frame_node) const;
 
+  mojo::Binding<resource_coordinator::mojom::DocumentCoordinationUnit> binding_;
+
   FrameNodeImpl* const parent_frame_node_;
   PageNodeImpl* const page_node_;
   ProcessNodeImpl* const process_node_;
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
index c943b2ee..f77b99e 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl_unittest.cc
@@ -58,13 +58,23 @@
   EXPECT_EQ(parent_node.get(), child3_node->parent_frame_node());
 }
 
-TEST_F(FrameNodeImplTest, Url) {
+TEST_F(FrameNodeImplTest, NavigationCommitted_SameDocument) {
   auto process = CreateNode<ProcessNodeImpl>();
   auto page = CreateNode<PageNodeImpl>();
   auto frame_node = CreateNode<FrameNodeImpl>(process.get(), page.get());
   EXPECT_TRUE(frame_node->url().is_empty());
   const GURL url("http://www.foo.com/");
-  frame_node->set_url(url);
+  frame_node->OnNavigationCommitted(url, /* same_document */ true);
+  EXPECT_EQ(url, frame_node->url());
+}
+
+TEST_F(FrameNodeImplTest, NavigationCommitted_DifferentDocument) {
+  auto process = CreateNode<ProcessNodeImpl>();
+  auto page = CreateNode<PageNodeImpl>();
+  auto frame_node = CreateNode<FrameNodeImpl>(process.get(), page.get());
+  EXPECT_TRUE(frame_node->url().is_empty());
+  const GURL url("http://www.foo.com/");
+  frame_node->OnNavigationCommitted(url, /* same_document */ false);
   EXPECT_EQ(url, frame_node->url());
 }
 
diff --git a/chrome/browser/performance_manager/graph/node_base.h b/chrome/browser/performance_manager/graph/node_base.h
index 005f673..5682e14 100644
--- a/chrome/browser/performance_manager/graph/node_base.h
+++ b/chrome/browser/performance_manager/graph/node_base.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/performance_manager/graph/node_type.h"
 #include "chrome/browser/performance_manager/graph/properties.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
@@ -119,25 +119,6 @@
   DISALLOW_COPY_AND_ASSIGN(TypedNodeBase);
 };
 
-template <class NodeImplClass, class MojoInterfaceClass, class MojoRequestClass>
-class CoordinationUnitInterface : public TypedNodeBase<NodeImplClass>,
-                                  public MojoInterfaceClass {
- public:
-  explicit CoordinationUnitInterface(GraphImpl* graph)
-      : TypedNodeBase<NodeImplClass>(graph) {}
-
-  ~CoordinationUnitInterface() override = default;
-
-  void AddBinding(MojoRequestClass request) {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
- private:
-  mojo::BindingSet<MojoInterfaceClass> bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(CoordinationUnitInterface);
-};
-
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_BASE_H_
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.cc b/chrome/browser/performance_manager/graph/process_node_impl.cc
index e5f767c6..b85a5099 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/process_node_impl.cc
@@ -12,7 +12,7 @@
 namespace performance_manager {
 
 ProcessNodeImpl::ProcessNodeImpl(GraphImpl* graph)
-    : CoordinationUnitInterface(graph) {
+    : TypedNodeBase(graph), binding_(this) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
@@ -36,6 +36,13 @@
   cpu_usage_ = cpu_usage;
 }
 
+void ProcessNodeImpl::Bind(
+    resource_coordinator::mojom::ProcessCoordinationUnitRequest request) {
+  if (binding_.is_bound())
+    binding_.Close();
+  binding_.Bind(std::move(request));
+}
+
 void ProcessNodeImpl::SetExpectedTaskQueueingDuration(
     base::TimeDelta duration) {
   expected_task_queueing_duration_.SetAndNotify(this, duration);
@@ -55,6 +62,9 @@
 
   // Close the process handle to kill the zombie.
   process_.Close();
+
+  // No more message should be received from this process.
+  binding_.Close();
 }
 
 void ProcessNodeImpl::SetProcess(base::Process process,
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.h b/chrome/browser/performance_manager/graph/process_node_impl.h
index e81480e..f47beb5 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.h
+++ b/chrome/browser/performance_manager/graph/process_node_impl.h
@@ -33,16 +33,17 @@
 // 4. Back to 2.
 class ProcessNodeImpl
     : public PublicNodeImpl<ProcessNodeImpl, ProcessNode>,
-      public CoordinationUnitInterface<
-          ProcessNodeImpl,
-          resource_coordinator::mojom::ProcessCoordinationUnit,
-          resource_coordinator::mojom::ProcessCoordinationUnitRequest> {
+      public TypedNodeBase<ProcessNodeImpl>,
+      public resource_coordinator::mojom::ProcessCoordinationUnit {
  public:
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kProcess; }
 
   explicit ProcessNodeImpl(GraphImpl* graph);
   ~ProcessNodeImpl() override;
 
+  void Bind(
+      resource_coordinator::mojom::ProcessCoordinationUnitRequest request);
+
   // resource_coordinator::mojom::ProcessCoordinationUnit implementation:
   void SetExpectedTaskQueueingDuration(base::TimeDelta duration) override;
   void SetMainThreadTaskLoadIsLow(bool main_thread_task_load_is_low) override;
@@ -105,6 +106,8 @@
 
   void LeaveGraph() override;
 
+  mojo::Binding<resource_coordinator::mojom::ProcessCoordinationUnit> binding_;
+
   base::TimeDelta cumulative_cpu_usage_;
   uint64_t private_footprint_kb_ = 0u;
 
diff --git a/chrome/browser/performance_manager/performance_manager_tab_helper.cc b/chrome/browser/performance_manager/performance_manager_tab_helper.cc
index 4e0b16c2..8b40d36 100644
--- a/chrome/browser/performance_manager/performance_manager_tab_helper.cc
+++ b/chrome/browser/performance_manager/performance_manager_tab_helper.cc
@@ -110,7 +110,8 @@
       render_frame_host->GetDevToolsFrameToken(),
       base::BindOnce(
           [](const GURL& url, bool is_current, FrameNodeImpl* frame_node) {
-            frame_node->set_url(url);
+            if (!url.is_empty())
+              frame_node->OnNavigationCommitted(url, /* same_document */ false);
             frame_node->SetIsCurrent(is_current);
           },
           render_frame_host->GetLastCommittedURL(),
@@ -213,7 +214,8 @@
 
   // Notify the frame of the committed URL.
   GURL url = navigation_handle->GetURL();
-  PostToGraph(FROM_HERE, &FrameNodeImpl::set_url, frame_node, url);
+  PostToGraph(FROM_HERE, &FrameNodeImpl::OnNavigationCommitted, frame_node, url,
+              navigation_handle->IsSameDocument());
 
   if (navigation_handle->IsSameDocument() ||
       !navigation_handle->IsInMainFrame()) {
@@ -257,7 +259,7 @@
 
   auto it = frames_.find(render_frame_host);
   DCHECK(it != frames_.end());
-  PostToGraph(FROM_HERE, &FrameNodeImpl::AddBinding, it->second.get(),
+  PostToGraph(FROM_HERE, &FrameNodeImpl::Bind, it->second.get(),
               resource_coordinator::mojom::DocumentCoordinationUnitRequest(
                   std::move(*interface_pipe)));
 }
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
index 9c9e9138..2e17749 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
@@ -27,7 +27,7 @@
   mock_graph.other_page->OnMainFrameNavigationCommitted(now, 2, kExampleUrl);
 
   auto* main_frame = mock_graph.page->GetMainFrameNode();
-  main_frame->set_url(kExampleUrl);
+  main_frame->OnNavigationCommitted(kExampleUrl, /* same_document */ false);
 
   WebUIGraphDumpImpl impl(&graph);
 
diff --git a/chrome/browser/previews/previews_offline_helper.cc b/chrome/browser/previews/previews_offline_helper.cc
index 836b5d5..d0b16dd 100644
--- a/chrome/browser/previews/previews_offline_helper.cc
+++ b/chrome/browser/previews/previews_offline_helper.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/hash/hash.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -28,6 +29,11 @@
 // Pref key for the available hashed pages kept in class.
 const char kHashedAvailablePages[] = "previews.offline_helper.available_pages";
 
+void RecordShouldAttemptOfflinePreviewResult(bool result) {
+  UMA_HISTOGRAM_BOOLEAN("Previews.Offline.FalsePositivePrevention.Allowed",
+                        result);
+}
+
 std::string HashURL(const GURL& url) {
   // We are ok with some hash collisions in exchange for non-arbitrary key
   // lengths (as in using the url.spec()). Therefore, use a hash and return that
@@ -163,17 +169,22 @@
   std::string hashed_url = HashURL(url);
 
   base::Value* value = available_pages_->FindKey(hashed_url);
-  if (!value)
+  if (!value) {
+    RecordShouldAttemptOfflinePreviewResult(false);
     return false;
+  }
 
   if (!value->is_string()) {
     NOTREACHED();
+    RecordShouldAttemptOfflinePreviewResult(false);
     return false;
   }
   base::Optional<base::Time> time_value =
       TimeFromDictionaryValue(value->GetString());
-  if (!time_value.has_value())
+  if (!time_value.has_value()) {
+    RecordShouldAttemptOfflinePreviewResult(false);
     return false;
+  }
 
   base::Time expiry =
       time_value.value() + previews::params::OfflinePreviewFreshnessDuration();
@@ -183,6 +194,7 @@
     UpdatePref();
   }
 
+  RecordShouldAttemptOfflinePreviewResult(!is_expired);
   return !is_expired;
 }
 
@@ -206,6 +218,9 @@
     AddSingleOfflineItemEntry(available_pages_.get(), page);
   RemoveStaleOfflinePageEntries(available_pages_.get());
   UpdatePref();
+
+  UMA_HISTOGRAM_COUNTS_100("Previews.Offline.FalsePositivePrevention.PrefSize",
+                           available_pages_->size());
 }
 
 void PreviewsOfflineHelper::OfflinePageModelLoaded(
diff --git a/chrome/browser/previews/previews_offline_helper_unittest.cc b/chrome/browser/previews/previews_offline_helper_unittest.cc
index bcffb95..9ea8654 100644
--- a/chrome/browser/previews/previews_offline_helper_unittest.cc
+++ b/chrome/browser/previews/previews_offline_helper_unittest.cc
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
@@ -177,6 +178,8 @@
   for (const TestCase& test_case : kTestCases) {
     SCOPED_TRACE(test_case.msg);
 
+    base::HistogramTester histogram_tester;
+
     base::test::ScopedFeatureList scoped_feature_list;
     scoped_feature_list.InitWithFeatureState(
         previews::features::kOfflinePreviewsFalsePositivePrevention,
@@ -213,6 +216,23 @@
     for (const std::string not_want : test_case.not_want_pages) {
       EXPECT_FALSE(helper->ShouldAttemptOfflinePreview(GURL(not_want)));
     }
+
+    histogram_tester.ExpectTotalCount(
+        "Previews.Offline.FalsePositivePrevention.Allowed",
+        test_case.enable_feature
+            ? test_case.not_want_pages.size() + test_case.want_pages.size()
+            : 0);
+
+    if (test_case.enable_feature && test_case.not_want_pages.size() > 0) {
+      histogram_tester.ExpectBucketCount(
+          "Previews.Offline.FalsePositivePrevention.Allowed", false,
+          test_case.not_want_pages.size());
+    }
+    if (test_case.enable_feature && test_case.want_pages.size() > 0) {
+      histogram_tester.ExpectBucketCount(
+          "Previews.Offline.FalsePositivePrevention.Allowed", true,
+          test_case.want_pages.size());
+    }
   }
 }
 
@@ -245,6 +265,8 @@
   scoped_feature_list.InitAndEnableFeature(
       previews::features::kOfflinePreviewsFalsePositivePrevention);
 
+  base::HistogramTester histogram_tester;
+
   PreviewsOfflineHelper* helper = NewHelper();
   base::Time now = base::Time::Now();
   base::Time expired = now -
@@ -263,4 +285,7 @@
   EXPECT_TRUE(helper->ShouldAttemptOfflinePreview(GURL("http://new.com")));
   EXPECT_TRUE(helper->ShouldAttemptOfflinePreview(GURL("http://new2.com")));
   EXPECT_FALSE(helper->ShouldAttemptOfflinePreview(GURL("http://expired.com")));
+
+  histogram_tester.ExpectUniqueSample(
+      "Previews.Offline.FalsePositivePrevention.PrefSize", 2, 1);
 }
diff --git a/chrome/browser/push_messaging/push_messaging_notification_manager.cc b/chrome/browser/push_messaging/push_messaging_notification_manager.cc
index 9183dc26..3175574 100644
--- a/chrome/browser/push_messaging/push_messaging_notification_manager.cc
+++ b/chrome/browser/push_messaging/push_messaging_notification_manager.cc
@@ -101,17 +101,18 @@
     Profile* profile)
     : profile_(profile), budget_database_(profile), weak_factory_(this) {}
 
-PushMessagingNotificationManager::~PushMessagingNotificationManager() {}
+PushMessagingNotificationManager::~PushMessagingNotificationManager() = default;
 
 void PushMessagingNotificationManager::EnforceUserVisibleOnlyRequirements(
     const GURL& origin,
     int64_t service_worker_registration_id,
-    base::OnceClosure message_handled_closure) {
+    EnforceRequirementsCallback message_handled_callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
 #if defined(OS_CHROMEOS)
   if (ShouldSkipUserVisibleOnlyRequirements(origin)) {
-    std::move(message_handled_closure).Run();
+    std::move(message_handled_callback)
+        .Run(/* did_show_generic_notification= */ false);
     return;
   }
 #endif
@@ -125,13 +126,13 @@
       base::BindOnce(
           &PushMessagingNotificationManager::DidGetNotificationsFromDatabase,
           weak_factory_.GetWeakPtr(), origin, service_worker_registration_id,
-          std::move(message_handled_closure)));
+          std::move(message_handled_callback)));
 }
 
 void PushMessagingNotificationManager::DidGetNotificationsFromDatabase(
     const GURL& origin,
     int64_t service_worker_registration_id,
-    base::OnceClosure message_handled_closure,
+    EnforceRequirementsCallback message_handled_callback,
     bool success,
     const std::vector<NotificationDatabaseData>& data) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -165,8 +166,9 @@
   if (notification_count >= 2) {
     for (const auto& notification_database_data : data) {
       if (notification_database_data.notification_data.tag !=
-          kPushMessagingForcedNotificationTag)
+          kPushMessagingForcedNotificationTag) {
         continue;
+      }
 
       PlatformNotificationServiceFactory::GetForProfile(profile_)
           ->ClosePersistentNotification(
@@ -183,7 +185,7 @@
         base::BindOnce(&PushMessagingNotificationManager::ProcessSilentPush,
                        weak_factory_.GetWeakPtr(), origin,
                        service_worker_registration_id,
-                       std::move(message_handled_closure)));
+                       std::move(message_handled_callback)));
     return;
   }
 
@@ -198,7 +200,8 @@
         blink::mojom::PushUserVisibleStatus::NOT_REQUIRED_BUT_SHOWN);
   }
 
-  std::move(message_handled_closure).Run();
+  std::move(message_handled_callback)
+      .Run(/* did_show_generic_notification= */ false);
 }
 
 bool PushMessagingNotificationManager::IsTabVisible(
@@ -237,7 +240,7 @@
 void PushMessagingNotificationManager::ProcessSilentPush(
     const GURL& origin,
     int64_t service_worker_registration_id,
-    base::OnceClosure message_handled_closure,
+    EnforceRequirementsCallback message_handled_callback,
     bool silent_push_allowed) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
@@ -245,7 +248,8 @@
   if (silent_push_allowed) {
     RecordUserVisibleStatus(
         blink::mojom::PushUserVisibleStatus::REQUIRED_BUT_NOT_SHOWN_USED_GRACE);
-    std::move(message_handled_closure).Run();
+    std::move(message_handled_callback)
+        .Run(/* did_show_generic_notification= */ false);
     return;
   }
 
@@ -271,18 +275,19 @@
       database_data,
       base::BindOnce(
           &PushMessagingNotificationManager::DidWriteNotificationData,
-          weak_factory_.GetWeakPtr(), std::move(message_handled_closure)));
+          weak_factory_.GetWeakPtr(), std::move(message_handled_callback)));
 }
 
 void PushMessagingNotificationManager::DidWriteNotificationData(
-    base::OnceClosure message_handled_closure,
+    EnforceRequirementsCallback message_handled_callback,
     bool success,
     const std::string& notification_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (!success)
     DLOG(ERROR) << "Writing forced notification to database should not fail";
 
-  std::move(message_handled_closure).Run();
+  std::move(message_handled_callback)
+      .Run(/* did_show_generic_notification= */ true);
 }
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/push_messaging/push_messaging_notification_manager.h b/chrome/browser/push_messaging/push_messaging_notification_manager.h
index fe054ef0..41bd07a8 100644
--- a/chrome/browser/push_messaging/push_messaging_notification_manager.h
+++ b/chrome/browser/push_messaging/push_messaging_notification_manager.h
@@ -41,6 +41,9 @@
 // https://crbug.com/437277
 class PushMessagingNotificationManager {
  public:
+  using EnforceRequirementsCallback =
+      base::OnceCallback<void(bool did_show_generic_notification)>;
+
   explicit PushMessagingNotificationManager(Profile* profile);
   ~PushMessagingNotificationManager();
 
@@ -49,7 +52,7 @@
   void EnforceUserVisibleOnlyRequirements(
       const GURL& origin,
       int64_t service_worker_registration_id,
-      base::OnceClosure message_handled_closure);
+      EnforceRequirementsCallback message_handled_callback);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(PushMessagingNotificationManagerTest, IsTabVisible);
@@ -62,7 +65,7 @@
   void DidGetNotificationsFromDatabase(
       const GURL& origin,
       int64_t service_worker_registration_id,
-      base::OnceClosure message_handled_closure,
+      EnforceRequirementsCallback message_handled_callback,
       bool success,
       const std::vector<content::NotificationDatabaseData>& data);
 
@@ -75,12 +78,13 @@
 
   void ProcessSilentPush(const GURL& origin,
                          int64_t service_worker_registration_id,
-                         base::OnceClosure message_handled_closure,
+                         EnforceRequirementsCallback message_handled_callback,
                          bool silent_push_allowed);
 
-  void DidWriteNotificationData(base::OnceClosure message_handled_closure,
-                                bool success,
-                                const std::string& notification_id);
+  void DidWriteNotificationData(
+      EnforceRequirementsCallback message_handled_callback,
+      bool success,
+      const std::string& notification_id);
 
 #if defined(OS_CHROMEOS)
   bool ShouldSkipUserVisibleOnlyRequirements(const GURL& origin);
diff --git a/chrome/browser/push_messaging/push_messaging_notification_manager_unittest.cc b/chrome/browser/push_messaging/push_messaging_notification_manager_unittest.cc
index a18ca99c..d6972b0 100644
--- a/chrome/browser/push_messaging/push_messaging_notification_manager_unittest.cc
+++ b/chrome/browser/push_messaging/push_messaging_notification_manager_unittest.cc
@@ -76,8 +76,11 @@
   bool was_called = false;
   manager.EnforceUserVisibleOnlyRequirements(
       app_url.GetOrigin(), 0l,
-      base::BindRepeating([](bool* was_called) { *was_called = true; },
-                          &was_called));
+      base::BindRepeating(
+          [](bool* was_called, bool did_show_generic_notification) {
+            *was_called = true;
+          },
+          &was_called));
   EXPECT_TRUE(was_called);
 }
 #endif
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
index 8476aa2..1103e3d5 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
@@ -300,11 +300,12 @@
 
   RecordDeliveryStatus(status);
 
-  base::Closure completion_closure =
-      base::Bind(&PushMessagingServiceImpl::DidHandleMessage,
-                 weak_factory_.GetWeakPtr(), app_id, message_handled_closure);
-  // The completion_closure should run by default at the end of this function,
-  // unless it is explicitly passed to another function.
+  base::RepeatingClosure completion_closure = base::BindRepeating(
+      &PushMessagingServiceImpl::DidHandleMessage, weak_factory_.GetWeakPtr(),
+      app_id, message_handled_closure,
+      false /* did_show_generic_notification */);
+  // The |completion_closure| should run by default at the end of this function,
+  // unless it is explicitly passed to another function or disabled.
   base::ScopedClosureRunner completion_closure_runner(completion_closure);
 
   // A reason to automatically unsubscribe. UNKNOWN means do not unsubscribe.
@@ -330,7 +331,11 @@
               switches::kAllowSilentPush)) {
         notification_manager_.EnforceUserVisibleOnlyRequirements(
             requesting_origin, service_worker_registration_id,
-            completion_closure_runner.Release());
+            base::BindOnce(&PushMessagingServiceImpl::DidHandleMessage,
+                           weak_factory_.GetWeakPtr(), app_id,
+                           message_handled_closure));
+        // Disable the default completion closure.
+        completion_closure_runner.ReplaceClosure(base::DoNothing());
       }
       break;
     case blink::mojom::PushDeliveryStatus::SERVICE_WORKER_ERROR:
@@ -367,7 +372,8 @@
 
 void PushMessagingServiceImpl::DidHandleMessage(
     const std::string& app_id,
-    const base::Closure& message_handled_closure) {
+    const base::RepeatingClosure& message_handled_closure,
+    bool did_show_generic_notification) {
   auto in_flight_iterator = in_flight_message_deliveries_.find(app_id);
   DCHECK(in_flight_iterator != in_flight_message_deliveries_.end());
 
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.h b/chrome/browser/push_messaging/push_messaging_service_impl.h
index af7ee439..1d03322 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.h
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.h
@@ -153,7 +153,8 @@
                               blink::mojom::PushDeliveryStatus status);
 
   void DidHandleMessage(const std::string& app_id,
-                        const base::Closure& completion_closure);
+                        const base::RepeatingClosure& completion_closure,
+                        bool did_show_generic_notification);
 
   // Subscribe methods ---------------------------------------------------------
 
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index c645a755..8fe598c 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -58,6 +58,9 @@
     if (!is_android) {
       deps += [ "app_management:closure_compile" ]
     }
+    if (is_win || is_mac || is_desktop_linux) {
+      deps += [ "browser_switcher:closure_compile" ]
+    }
   }
 }
 
diff --git a/chrome/browser/resources/browser_switcher/BUILD.gn b/chrome/browser/resources/browser_switcher/BUILD.gn
index d837061..8e1af835 100644
--- a/chrome/browser/resources/browser_switcher/BUILD.gn
+++ b/chrome/browser/resources/browser_switcher/BUILD.gn
@@ -7,20 +7,18 @@
 js_type_check("closure_compile") {
   deps = [
     ":app",
-    ":browser_switcher",
     ":browser_switcher_proxy",
+    "internals:browser_switcher_internals",
   ]
 }
 
 js_library("app") {
   deps = [
     "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js:i18n_behavior",
   ]
 }
 
-js_library("browser_switcher") {
-}
-
 js_library("browser_switcher_proxy") {
   deps = [
     "//ui/webui/resources/js:cr",
diff --git a/chrome/browser/resources/browser_switcher/browser_switcher_proxy.js b/chrome/browser/resources/browser_switcher/browser_switcher_proxy.js
index 4c38e59..3611939 100644
--- a/chrome/browser/resources/browser_switcher/browser_switcher_proxy.js
+++ b/chrome/browser/resources/browser_switcher/browser_switcher_proxy.js
@@ -15,7 +15,7 @@
     gotoNewTabPage() {}
   }
 
-  /** @implements {settings.BrowserSwitcherProxy} */
+  /** @implements {browser_switcher.BrowserSwitcherProxy} */
   class BrowserSwitcherProxyImpl {
     /** @override */
     launchAlternativeBrowserAndCloseTab(url) {
diff --git a/chrome/browser/resources/browser_switcher/internals/BUILD.gn b/chrome/browser/resources/browser_switcher/internals/BUILD.gn
new file mode 100644
index 0000000..6d3279dc
--- /dev/null
+++ b/chrome/browser/resources/browser_switcher/internals/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+  deps = [
+    ":browser_switcher_internals",
+  ]
+}
+
+js_library("browser_switcher_internals") {
+  deps = [
+    "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js:util",
+  ]
+}
diff --git a/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.html b/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.html
new file mode 100644
index 0000000..6ac61de0
--- /dev/null
+++ b/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>Legacy Browser Support Internals</title>
+
+  <script src="chrome://resources/js/promise_resolver.js"></script>
+  <script src="chrome://resources/js/cr.js"></script>
+  <script src="chrome://resources/js/util.js"></script>
+
+  <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+
+  <style>
+    table {
+      border-collapse: collapse;
+      font-family: monospace;
+      font-size: 1.25em;
+    }
+
+    th {
+      background: black;
+      color: white;
+    }
+
+    th,
+    td {
+      border: 1px solid black;
+      padding: 6px 10px;
+      text-align: center;
+    }
+
+    .url {
+      text-align: start;
+    }
+  </style>
+</head>
+<body>
+  <h1>Legacy Browser Support Internals</h1>
+
+  <!-- TODO(crbug/959379): Hide all this and show a message if
+                           BrowserSwitcherEnabled is false. -->
+
+  <h2>Sitelist</h2>
+  <table id="sitelist"></table>
+
+  <h2>Greylist</h2>
+  <table id="greylist"></table>
+
+  <template id="header-row-template">
+    <tr>
+      <th>Rule</th>
+      <th>Source</th>
+      <th>Type</th>
+      <th>Inverted?</th>
+    </tr>
+  </template>
+
+  <template id="rule-row-template">
+    <tr>
+      <td></td>
+      <td></td>
+      <td></td>
+      <td></td>
+    </tr>
+  </template>
+
+  <script src="/internals/browser_switcher_internals.js"></script>
+</body>
+</html>
diff --git a/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.js b/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.js
new file mode 100644
index 0000000..7ec8fb5b
--- /dev/null
+++ b/chrome/browser/resources/browser_switcher/internals/browser_switcher_internals.js
@@ -0,0 +1,83 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+/**
+ * @typedef {{
+ *   sitelist: Array<string>,
+ *   greylist: Array<string>,
+ * }}
+ */
+let RuleSet;
+
+/**
+ * @typedef {{
+ *   gpo: RuleSet,
+ *   ieem: (RuleSet|undefined),
+ *   external: (RuleSet|undefined),
+ * }}
+ */
+let RuleSetList;
+
+/**
+ * Clears the table, and inserts a header row.
+ * @param {HTMLTableElement} table
+ */
+function clearTable(table) {
+  table.innerHTML = '';
+  const headerRow = document.importNode($('header-row-template').content, true);
+  table.appendChild(headerRow);
+}
+
+/**
+ * @param {string} rule
+ * @return {string} String describing the rule type.
+ */
+function getRuleType(rule) {
+  if (rule == '*') {
+    return 'wildcard';
+  }
+  if (rule.includes('/')) {
+    return 'prefix';
+  }
+  return 'hostname';
+}
+
+/**
+ * Creates and returns a <tr> element for the given rule.
+ * @param {string} rule
+ * @param {string} rulesetName
+ * @return {HTMLTableRowElement}
+ */
+function createRowForRule(rule, rulesetName) {
+  const row = document.importNode($('rule-row-template').content, true);
+  const cells = row.querySelectorAll('td');
+  cells[0].innerText = rule;
+  cells[0].className = 'url';
+  cells[1].innerText = rulesetName;
+  cells[2].innerText = getRuleType(rule);
+  cells[3].innerText = /^!/.test(rule) ? 'yes' : 'no';
+  return /** @type {HTMLTableRowElement} */ (row);
+}
+
+/**
+ * Updates the content of all tables after receiving data from the backend.
+ * @param {RuleSetList} rulesets
+ */
+function updateTables(rulesets) {
+  clearTable(/** @type {HTMLTableElement} */ ($('sitelist')));
+  clearTable(/** @type {HTMLTableElement} */ ($('greylist')));
+
+  for (const [rulesetName, ruleset] of Object.entries(rulesets)) {
+    for (const [listName, rules] of Object.entries(ruleset)) {
+      const table = $(listName);
+      for (const rule of rules) {
+        table.appendChild(createRowForRule(rule, rulesetName));
+      }
+    }
+  }
+}
+
+cr.sendWithPromise('getAllRulesets').then(updateTables);
diff --git a/chrome/browser/resources/downloads/manager.js b/chrome/browser/resources/downloads/manager.js
index 2bbf5ae..046603a7 100644
--- a/chrome/browser/resources/downloads/manager.js
+++ b/chrome/browser/resources/downloads/manager.js
@@ -117,10 +117,6 @@
 
     /** @private */
     hasDownloadsChanged_: function() {
-      if (loadTimeData.getBoolean('allowDeletingHistory')) {
-        this.$.toolbar.downloadsShowing = this.hasDownloads_;
-      }
-
       if (this.hasDownloads_) {
         this.$.downloadsList.fire('iron-resize');
       }
@@ -156,6 +152,12 @@
     /** @private */
     itemsChanged_: function() {
       this.hasDownloads_ = this.items_.length > 0;
+      this.$.toolbar.hasClearableDownloads =
+          loadTimeData.getBoolean('allowDeletingHistory') &&
+          this.items_.some(
+              ({state}) => state != downloads.States.DANGEROUS &&
+                  state != downloads.States.IN_PROGRESS &&
+                  state != downloads.States.PAUSED);
 
       if (this.inSearchMode_) {
         Polymer.IronA11yAnnouncer.requestAvailability();
diff --git a/chrome/browser/resources/downloads/toolbar.html b/chrome/browser/resources/downloads/toolbar.html
index d07eb81..42d38f18 100644
--- a/chrome/browser/resources/downloads/toolbar.html
+++ b/chrome/browser/resources/downloads/toolbar.html
@@ -44,12 +44,10 @@
     </cr-toolbar>
     <cr-action-menu id="moreActionsMenu"
         aria-label="$i18n{actionMenuDescription}">
-      <button class="dropdown-item clear-all"
-          on-click="onClearAllTap_">
+      <button class="dropdown-item clear-all" on-click="onClearAllTap_">
         $i18n{clearAll}
       </button>
-      <button class="dropdown-item"
-          on-click="onOpenDownloadsFolderTap_">
+      <button class="dropdown-item" on-click="onOpenDownloadsFolderTap_">
         $i18n{openDownloadsFolder}
       </button>
     </cr-action-menu>
diff --git a/chrome/browser/resources/downloads/toolbar.js b/chrome/browser/resources/downloads/toolbar.js
index 5ab454a..b096dbb 100644
--- a/chrome/browser/resources/downloads/toolbar.js
+++ b/chrome/browser/resources/downloads/toolbar.js
@@ -7,11 +7,10 @@
     is: 'downloads-toolbar',
 
     properties: {
-      downloadsShowing: {
-        reflectToAttribute: true,
+      hasClearableDownloads: {
         type: Boolean,
         value: false,
-        observer: 'downloadsShowingChanged_',
+        observer: 'updateClearAll_',
       },
 
       spinnerActive: {
@@ -35,7 +34,7 @@
 
     /** @return {boolean} Whether "Clear all" should be allowed. */
     canClearAll: function() {
-      return this.getSearchText().length == 0 && this.downloadsShowing;
+      return this.getSearchText().length == 0 && this.hasClearableDownloads;
     },
 
     /** @return {string} The full text being searched. */
@@ -52,11 +51,6 @@
     },
 
     /** @private */
-    downloadsShowingChanged_: function() {
-      this.updateClearAll_();
-    },
-
-    /** @private */
     onClearAllTap_: function() {
       assert(this.canClearAll());
       this.mojoHandler_.clearAll();
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css
index b4f3a049..c719258 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.css
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -456,10 +456,6 @@
   margin-inline-end: 8px;
 }
 
-#bg-sel-footer-toggle-text {
-  padding: 24px 0 0 16px;
-}
-
 .bg-sel-tile {
   background-size: cover;
   height: 100%;
@@ -603,42 +599,6 @@
   width: 118px;
 }
 
-#bg-daily-refresh {
- margin: 23px 0 0 16px;
-}
-
-.is-img-sel #bg-daily-refresh {
-  display: none;
-}
-
-.is-col-sel #bg-daily-refresh {
-  display: none;
-}
-
-.is-img-sel #bg-sel-refresh-text {
-  display: none;
-  margin: 24px 0 0 64px;
-}
-
-.is-col-sel #bg-sel-refresh-text {
-  display: none;
-}
-
-.plus-icon {
-  background: url(icons/add.svg);
-  background-size: 22px 22px;
-  height: 22px;
-  left: 67px;
-  position: absolute;
-  top: 47px;
-  width: 22px;
-}
-
-html[dir=rtl] .plus-icon {
-  left: auto;
-  right: 67px;
-}
-
 #custom-bg-attr {
   border-radius: 8px;
   bottom: 16px;
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js
index ec0438ab..256fe84c 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.js
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -72,7 +72,6 @@
   ATTR1: 'attr1',
   ATTR2: 'attr2',
   ATTRIBUTIONS: 'custom-bg-attr',
-  BACK: 'bg-sel-back',
   BACK_CIRCLE: 'bg-sel-back-circle',
   CANCEL: 'bg-sel-footer-cancel',
   CUSTOMIZATION_MENU: 'customization-menu',
@@ -88,17 +87,11 @@
   EDIT_BG_MENU: 'edit-bg-menu',
   EDIT_BG_TEXT: 'edit-bg-text',
   MENU_CANCEL: 'menu-cancel',
-  MSG_BOX: 'message-box',
-  MSG_BOX_MSG: 'message-box-message',
-  MSG_BOX_LINK: 'message-box-link',
-  MSG_BOX_CONTAINER: 'message-box-container',
   LINK_ICON: 'link-icon',
   MENU: 'bg-sel-menu',
   OPTIONS_TITLE: 'edit-bg-title',
   RESTORE_DEFAULT: 'edit-bg-restore-default',
   RESTORE_DEFAULT_TEXT: 'edit-bg-restore-default-text',
-  REFRESH_TEXT: 'bg-sel-refresh-text',
-  REFRESH_TOGGLE: 'bg-daily-refresh',
   UPLOAD_IMAGE: 'edit-bg-upload-image',
   UPLOAD_IMAGE_TEXT: 'edit-bg-upload-image-text',
   TILES: 'bg-sel-tiles',
@@ -119,16 +112,11 @@
   COLLECTION_TILE: 'bg-sel-tile',  // Preview tile for background customization
   COLLECTION_TILE_BG: 'bg-sel-tile-bg',
   COLLECTION_TITLE: 'bg-sel-tile-title',  // Title of a background image
-  DONE_AVAILABLE: 'done-available',
   // Extended and elevated style for entry point.
   ENTRY_POINT_ENHANCED: 'ep-enhanced',
-  FLOAT_UP: 'float-up',
-  HAS_LINK: 'has-link',
-  HIDE_MSG_BOX: 'message-box-hide',
   IMAGE_DIALOG: 'is-img-sel',
   OPTION: 'bg-option',
   OPTION_DISABLED: 'bg-option-disabled',  // The menu option is disabled.
-  PLUS_ICON: 'plus-icon',
   MOUSE_NAV: 'using-mouse-nav',
   SELECTED_BORDER: 'selected-border',
   SELECTED_CHECK: 'selected-check',
@@ -603,7 +591,6 @@
       $(customBackgrounds.IDS.DONE).tabIndex = 0;
 
       // Turn toggle off when an image is selected.
-      $(customBackgrounds.IDS.REFRESH_TOGGLE).children[0].checked = false;
       $(customBackgrounds.IDS.DONE).disabled = false;
       ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
                                 .NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE);
@@ -955,8 +942,6 @@
       configData.translatedStrings.uploadImage;
   $(customBackgrounds.IDS.RESTORE_DEFAULT_TEXT).textContent =
       configData.translatedStrings.restoreDefaultBackground;
-  $(customBackgrounds.IDS.REFRESH_TEXT).textContent =
-      configData.translatedStrings.dailyRefresh;
   $(customBackgrounds.IDS.DONE).textContent =
       configData.translatedStrings.selectionDone;
   $(customBackgrounds.IDS.CANCEL).textContent =
@@ -1178,15 +1163,6 @@
     }
   };
 
-  // Interactions with the "Daily refresh" toggle.
-  $(customBackgrounds.IDS.REFRESH_TOGGLE).onclick = function(event) {
-    if (customBackgrounds.selectedTile) {
-      customBackgrounds.removeSelectedState(customBackgrounds.selectedTile);
-      customBackgrounds.selectedTile = null;
-    }
-    $(customBackgrounds.IDS.DONE).disabled = false;
-  };
-
   // On any arrow key event in the tiles area, focus the first tile.
   $(customBackgrounds.IDS.TILES).onkeydown = function(event) {
     if (event.keyCode === customBackgrounds.KEYCODES.LEFT ||
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html
index ec3fa92..9615ac8d 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.html
+++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -162,11 +162,6 @@
     </div>
     <div id="bg-sel-tiles" tabindex="0"></div>
     <div id="bg-sel-footer">
-      <label id="bg-daily-refresh" class="switch">
-        <input type="checkbox">
-        <span class="toggle"></span>
-      </label>
-      <div id="bg-sel-refresh-text"></div>
       <button id="bg-sel-footer-cancel" class="bg-sel-footer-button paper secondary ripple"
           tabindex="0"></button>
       <button id="bg-sel-footer-done" class="bg-sel-footer-button paper primary ripple"
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.js b/chrome/browser/resources/settings/appearance_page/appearance_page.js
index 3c0647d..9fa3b60a 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.js
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.js
@@ -12,6 +12,11 @@
  */
 const SIZE_DIFFERENCE_FIXED_STANDARD = 3;
 
+/**
+ * ID for autogenerated themes. Should match
+ * |ThemeService::kAutogeneratedThemeID|.
+ */
+const AUTOGENERATED_THEME_ID = 'autogenerated_theme_id';
 
 /**
  * 'settings-appearance-page' is the settings page containing appearance
@@ -280,7 +285,7 @@
       return;
     }
 
-    if (themeId.length > 0) {
+    if (themeId.length > 0 && themeId != AUTOGENERATED_THEME_ID) {
       assert(!useSystemTheme);
 
       this.browserProxy_.getThemeInfo(themeId).then(info => {
@@ -291,6 +296,13 @@
       return;
     }
 
+    this.themeUrl_ = '';
+
+    if (themeId == AUTOGENERATED_THEME_ID) {
+      this.themeSublabel_ = this.i18n('chromeColors');
+      return;
+    }
+
     let i18nId;
     // <if expr="is_linux and not chromeos">
     i18nId = useSystemTheme ? 'systemTheme' : 'classicTheme';
@@ -299,7 +311,6 @@
     i18nId = 'chooseFromWebStore';
     // </if>
     this.themeSublabel_ = this.i18n(i18nId);
-    this.themeUrl_ = '';
   },
 
   /** @private */
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index c9e4d46..22fc385 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -325,7 +325,9 @@
                 restamp>
               <settings-section page-title="$i18n{resetPageTitle}"
                   section="reset">
-                <settings-reset-page prefs="{{prefs}}"></settings-reset-page>
+                <settings-reset-page prefs="{{prefs}}"
+                    page-visibility="[[pageVisibility.reset]]">
+                </settings-reset-page>
               </settings-section>
             </template>
           </div>
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 2a1b1036..5dbff8e1 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -64,6 +64,7 @@
   deps = [
     "os_people_page:closure_compile",
     "os_privacy_page:closure_compile",
+    "os_reset_page:closure_compile",
     "os_settings_main:closure_compile",
     "os_settings_menu:closure_compile",
     "os_settings_page:closure_compile",
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.html b/chrome/browser/resources/settings/chromeos/lazy_load.html
index 278048b7..8309a33 100644
--- a/chrome/browser/resources/settings/chromeos/lazy_load.html
+++ b/chrome/browser/resources/settings/chromeos/lazy_load.html
@@ -6,7 +6,7 @@
   <link rel="import" href="../downloads_page/downloads_page.html">
   <link rel="import" href="../languages_page/languages_page.html">
   <link rel="import" href="../printing_page/printing_page.html">
-  <link rel="import" href="../reset_page/reset_page.html">
+  <link rel="import" href="os_reset_page/os_reset_page.html">
   <link rel="import" href="os_privacy_page/os_privacy_page.html">
 </body>
 </html>
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
new file mode 100644
index 0000000..85fc4d8
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn
@@ -0,0 +1,36 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//third_party/closure_compiler/compile_js.gni")
+
+js_type_check("closure_compile") {
+  deps = [
+    ":os_powerwash_dialog",
+    ":os_reset_page",
+    ":reset_os_proxy",
+  ]
+}
+
+js_library("os_powerwash_dialog") {
+  deps = [
+    ":reset_os_proxy",
+    "../..:lifetime_browser_proxy",
+  ]
+}
+
+js_library("os_reset_page") {
+  deps = [
+    "../..:page_visibility",
+    "//ui/webui/resources/js:assert",
+    "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink",
+  ]
+}
+
+js_library("reset_os_proxy") {
+  deps = [
+    "//ui/webui/resources/js:cr",
+  ]
+  externs_list = [ "$externs_path/chrome_send.js" ]
+}
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html
new file mode 100644
index 0000000..4fd8ff17
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html
@@ -0,0 +1,33 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="reset_os_proxy.html">
+<link rel="import" href="../../lifetime_browser_proxy.html">
+<link rel="import" href="../../settings_shared_css.html">
+
+<dom-module id="os-settings-powerwash-dialog">
+  <template>
+    <style include="settings-shared">
+    </style>
+    <cr-dialog id="dialog" close-text="$i18n{close}"
+        ignore-enter-key>
+      <div slot="title">$i18n{powerwashDialogTitle}</div>
+      <div slot="body">
+        <span>
+          $i18n{powerwashDialogExplanation}
+          <a href="$i18nRaw{powerwashLearnMoreUrl}" target="_blank">
+            $i18n{learnMore}
+          </a>
+        </span>
+      </div>
+      <div slot="button-container">
+        <paper-button class="cancel-button" on-click="onCancelTap_"
+            id="cancel">$i18n{cancel}</paper-button>
+        <paper-button class="action-button" id="powerwash"
+            on-click="onRestartTap_">$i18n{powerwashDialogButton}</paper-button>
+      </div>
+    </cr-dialog>
+  </template>
+  <script src="os_powerwash_dialog.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js
new file mode 100644
index 0000000..809b25e
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js
@@ -0,0 +1,37 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * 'os-settings-powerwash-dialog' is a dialog shown to request confirmation
+ * from the user for a device reset (aka powerwash).
+ */
+Polymer({
+  is: 'os-settings-powerwash-dialog',
+
+  properties: {
+    /** @public */
+    requestTpmFirmwareUpdate: {
+      type: Boolean,
+      value: false,
+    }
+  },
+
+  /** @override */
+  attached: function() {
+    settings.ResetOsProxyImpl.getInstance().onPowerwashDialogShow();
+    this.$.dialog.showModal();
+  },
+
+  /** @private */
+  onCancelTap_: function() {
+    this.$.dialog.close();
+  },
+
+  /** @private */
+  onRestartTap_: function() {
+    settings.LifetimeBrowserProxyImpl.getInstance().factoryReset(
+        this.requestTpmFirmwareUpdate);
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.html b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.html
new file mode 100644
index 0000000..79d46be
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.html
@@ -0,0 +1,20 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html">
+<link rel="import" href="os_powerwash_dialog.html">
+<link rel="import" href="../../i18n_setup.html">
+
+<dom-module id="os-settings-reset-page">
+  <template>
+    <cr-link-row class="hr" id="powerwash"
+        label="$i18n{powerwashTitle}" on-click="onShowPowerwashDialog_"
+        sub-label="$i18n{powerwashDescription}"></cr-link-row>
+    <template is="dom-if" if="[[showPowerwashDialog_]]" restamp>
+      <settings-powerwash-dialog on-close="onPowerwashDialogClose_">
+      </settings-powerwash-dialog>
+    </template>
+  </template>
+  <script src="os_reset_page.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js
new file mode 100644
index 0000000..12a8142
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js
@@ -0,0 +1,34 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * 'os-settings-reset-page' is the OS settings page containing reset
+ * settings.
+ */
+Polymer({
+  is: 'os-settings-reset-page',
+
+
+  properties: {
+    /** @private */
+    showPowerwashDialog_: Boolean,
+  },
+
+  /** @private */
+  /**
+   * @param {!Event} e
+   * @private
+   */
+  onShowPowerwashDialog_: function(e) {
+    e.preventDefault();
+    this.showPowerwashDialog_ = true;
+  },
+
+  /** @private */
+  onPowerwashDialogClose_: function() {
+    this.showPowerwashDialog_ = false;
+    cr.ui.focusWithoutInk(assert(this.$.powerwash));
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.html b/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.html
new file mode 100644
index 0000000..77b9e53
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.html
@@ -0,0 +1,2 @@
+<link rel="import" href="chrome://resources/html/cr.html">
+<script src="reset_os_proxy.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.js b/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.js
new file mode 100644
index 0000000..83929c9
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/reset_os_proxy.js
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('settings', function() {
+  /** @interface */
+  class ResetOsProxy {
+    /**
+     * A method to be called when the reset powerwash dialog is shown.
+     */
+    onPowerwashDialogShow() {}
+
+    /**
+     * Initiates a factory reset and restarts ChromeOS.
+     */
+    requestFactoryResetRestart() {}
+  }
+
+  /**
+   * @implements {settings.ResetOsProxy}
+   */
+  class ResetOsProxyImpl {
+    /** @override */
+    onPowerwashDialogShow() {
+      chrome.send('onPowerwashDialogShow');
+    }
+
+    /** @override */
+    requestFactoryResetRestart() {
+      chrome.send('requestFactoryResetRestart');
+    }
+  }
+
+  cr.addSingletonGetter(ResetOsProxyImpl);
+
+  return {
+    ResetOsProxy: ResetOsProxy,
+    ResetOsProxyImpl: ResetOsProxyImpl,
+  };
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
index 099dd4ac..6824edc 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -83,10 +83,6 @@
     <template is="dom-if" if="[[showBasicPage_(
         currentRoute_, inSearchMode, hasExpandedSection_)]]">
       <div id="basicPage">
-        <template is="dom-if" if="[[showResetProfileBanner_]]" restamp>
-          <settings-reset-profile-banner on-close="onResetProfileBannerClosed_">
-          </settings-reset-profile-banner>
-        </template>
         <div id="secondaryUserBanner" hidden="[[!showSecondaryUserBanner_]]">
           <div id="secondaryUserIcon"></div>
           <div class="flex">$i18n{secondaryUserBannerText}</div>
@@ -267,7 +263,7 @@
                 restamp>
               <settings-section page-title="$i18n{resetPageTitle}"
                   section="reset">
-                <settings-reset-page prefs="{{prefs}}"></settings-reset-page>
+                <os-settings-reset-page></os-settings-reset-page>
               </settings-section>
             </template>
           </div>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js
index 024e64d..f6591654 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.js
@@ -67,18 +67,6 @@
     },
 
     /**
-     * True if the basic page should currently display the reset profile banner.
-     * @private {boolean}
-     */
-    showResetProfileBanner_: {
-      type: Boolean,
-      value: function() {
-        return loadTimeData.getBoolean('showResetProfileBanner');
-      },
-    },
-
-    // <if expr="chromeos">
-    /**
      * Whether the user is a secondary user. Computed so that it is calculated
      * correctly after loadTimeData is available.
      * @private
@@ -87,7 +75,6 @@
       type: Boolean,
       computed: 'computeShowSecondaryUserBanner_(hasExpandedSection_)',
     },
-    // </if>
 
     /** @private {!settings.Route|undefined} */
     currentRoute_: Object,
@@ -207,7 +194,6 @@
     });
   },
 
-  // <if expr="chromeos">
   /**
    * @return {boolean}
    * @private
@@ -216,12 +202,6 @@
     return !this.hasExpandedSection_ &&
         loadTimeData.getBoolean('isSecondaryUser');
   },
-  // </if>
-
-  /** @private */
-  onResetProfileBannerClosed_: function() {
-    this.showResetProfileBanner_ = false;
-  },
 
   /**
    * @param {!AndroidAppsInfo} info
diff --git a/chrome/browser/resources/settings/languages_page/languages_page.js b/chrome/browser/resources/settings/languages_page/languages_page.js
index 6cc513fe..649d7ae 100644
--- a/chrome/browser/resources/settings/languages_page/languages_page.js
+++ b/chrome/browser/resources/settings/languages_page/languages_page.js
@@ -60,6 +60,9 @@
         return [];
       },
     },
+
+    /** @private {string|undefined} */
+    languageSyncedWithBrowserEnableSpellchecking_: String,
     // </if>
 
     /**
@@ -552,15 +555,40 @@
           `spellCheckLanguages_.${i}.downloadDictionaryFailureCount`);
     }
 
-    this.hideSpellCheckLanguages_ = this.spellCheckLanguages_.length === 1 &&
-        !!this.spellCheckLanguages_[0].spellCheckEnabled &&
-        !!this.getPref('browser.enable_spellchecking').value;
-
     if (this.spellCheckLanguages_.length === 0) {
       // If there are no supported spell check languages, automatically turn
       // off spell check to indicate no spell check will happen.
       this.setPrefValue('browser.enable_spellchecking', false);
     }
+
+    if (this.spellCheckLanguages_.length === 1) {
+      const singleLanguage = this.spellCheckLanguages_[0];
+
+      // Hide list of spell check languages if there is only 1 language
+      // and we don't need to display any errors for that language
+      this.hideSpellCheckLanguages_ = !singleLanguage.isManaged &&
+          singleLanguage.downloadDictionaryFailureCount === 0;
+
+      // Turn off spell check if spell check for the 1 remaining language is off
+      if (!singleLanguage.spellCheckEnabled) {
+        this.setPrefValue('browser.enable_spellchecking', false);
+        this.languageSyncedWithBrowserEnableSpellchecking_ =
+            singleLanguage.language.code;
+      }
+
+      // Undo the sync if spell check appeared as turned off for the language
+      // because a download was still in progress. This only occurs when
+      // Settings is loaded for the very first time and dictionaries have not
+      // been downloaded yet.
+      if (this.languageSyncedWithBrowserEnableSpellchecking_ ===
+              singleLanguage.language.code &&
+          singleLanguage.spellCheckEnabled) {
+        this.setPrefValue('browser.enable_spellchecking', true);
+      }
+    } else {
+      this.hideSpellCheckLanguages_ = false;
+      this.languageSyncedWithBrowserEnableSpellchecking_ = undefined;
+    }
   },
 
   /** @private */
@@ -569,6 +597,16 @@
       return;
     }
 
+    // If there is only 1 language, we hide the list of languages so users
+    // are unable to toggle on/off spell check specifically for the 1 language.
+    // Therefore, we need to treat the toggle for `browser.enable_spellchecking`
+    // as the toggle for the 1 language as well.
+    if (this.spellCheckLanguages_.length === 1) {
+      this.languageHelper.toggleSpellCheck(
+          this.spellCheckLanguages_[0].language.code,
+          !!this.getPref('browser.enable_spellchecking').value);
+    }
+
     // <if expr="_google_chrome">
     // When spell check is disabled, automatically disable using the spelling
     // service. This resets the spell check option to 'Use basic spell check'
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index 25d5096..11f31e9 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -464,37 +464,23 @@
                  type="chrome_html"
                  preprocess="true" />
       <structure name="IDR_OS_SETTINGS_POWERWASH_DIALOG_HTML"
-                 file="reset_page/powerwash_dialog.html"
+                 file="chromeos/os_reset_page/os_powerwash_dialog.html"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_POWERWASH_DIALOG_JS"
-                 file="reset_page/powerwash_dialog.js"
+                 file="chromeos/os_reset_page/os_powerwash_dialog.js"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_RESET_PAGE_HTML"
-                 file="reset_page/reset_page.html"
+                 file="chromeos/os_reset_page/os_reset_page.html"
                  type="chrome_html"
                  preprocess="true" />
       <structure name="IDR_OS_SETTINGS_RESET_PAGE_JS"
-                 file="reset_page/reset_page.js"
-                 preprocess="true"
+                 file="chromeos/os_reset_page/os_reset_page.js"
                  type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_RESET_PROFILE_DIALOG_HTML"
-                 file="reset_page/reset_profile_dialog.html"
+      <structure name="IDR_OS_SETTINGS_RESET_OS_PROXY_JS"
+                 file="chromeos/os_reset_page/reset_os_proxy.js"
                  type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_RESET_PROFILE_DIALOG_JS"
-                 file="reset_page/reset_profile_dialog.js"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_RESET_PROFILE_BANNER_HTML"
-                 file="reset_page/reset_profile_banner.html"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_RESET_PROFILE_BANNER_JS"
-                 file="reset_page/reset_profile_banner.js"
-                 type="chrome_html"/>
-      <structure name="IDR_OS_SETTINGS_RESET_BROWSER_PROXY_JS"
-                 file="reset_page/reset_browser_proxy.js"
-                 preprocess="true"
-                 type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_RESET_BROWSER_PROXY_HTML"
-                 file="reset_page/reset_browser_proxy.html"
+      <structure name="IDR_OS_SETTINGS_RESET_OS_PROXY_HTML"
+                 file="chromeos/os_reset_page/reset_os_proxy.html"
                  type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_LANGUAGES_HTML"
                  file="languages_page/languages.html"
diff --git a/chrome/browser/resources/settings/page_visibility.js b/chrome/browser/resources/settings/page_visibility.js
index 823fb641..ab17349 100644
--- a/chrome/browser/resources/settings/page_visibility.js
+++ b/chrome/browser/resources/settings/page_visibility.js
@@ -21,7 +21,7 @@
  *   onStartup: (boolean|undefined),
  *   people: (boolean|undefined|PeoplePageVisibility),
  *   privacy: (boolean|undefined|PrivacyPageVisibility),
- *   reset:(boolean|undefined),
+ *   reset:(boolean|undefined|ResetPageVisibility),
  * }}
  */
 let PageVisibility;
@@ -63,6 +63,13 @@
  */
 let PrivacyPageVisibility;
 
+/**
+ * @typedef {{
+ *   powerwash: boolean,
+ * }}
+ */
+let ResetPageVisibility;
+
 cr.define('settings', function() {
   /**
    * Dictionary defining page visibility.
@@ -95,7 +102,9 @@
       autofill: false,
       people: false,
       onStartup: false,
-      reset: false,
+      reset: {
+        powerwash: false,
+      },
       appearance: {
         setWallpaper: false,
         setTheme: false,
@@ -133,7 +142,9 @@
         manageUsers: showOSSettings,
       },
       onStartup: true,
-      reset: true,
+      reset: {
+        powerwash: showOSSettings,
+      },
       appearance: {
         setWallpaper: showOSSettings,
         setTheme: true,
diff --git a/chrome/browser/resources/settings/reset_page/BUILD.gn b/chrome/browser/resources/settings/reset_page/BUILD.gn
index 53cc82a..e8ce13f 100644
--- a/chrome/browser/resources/settings/reset_page/BUILD.gn
+++ b/chrome/browser/resources/settings/reset_page/BUILD.gn
@@ -23,6 +23,7 @@
 js_library("reset_page") {
   deps = [
     ":reset_profile_dialog",
+    "..:page_visibility",
     "..:route",
     "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render",
     "//ui/webui/resources/js:assert",
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.js b/chrome/browser/resources/settings/reset_page/reset_page.js
index 22cf6ae..2d1606c 100644
--- a/chrome/browser/resources/settings/reset_page/reset_page.js
+++ b/chrome/browser/resources/settings/reset_page/reset_page.js
@@ -25,15 +25,20 @@
     prefs: Object,
 
     // <if expr="chromeos">
-    /** @private */
-    showPowerwashDialog_: Boolean,
-    // </if>
+    /**
+     * Dictionary defining page visibility.
+     * @type {!ResetPageVisibility}
+     */
+    pageVisibility: Object,
 
     /** @private */
-    allowPowerwash_: {
-      type: Boolean,
-      value: cr.isChromeOS ? loadTimeData.getBoolean('allowPowerwash') : false
-    },
+    showPowerwashDialog_: Boolean,
+
+    /** @private */
+    allowPowerwash_:
+        {type: Boolean, value: loadTimeData.getBoolean('allowPowerwash')},
+    // </if>
+
 
     // <if expr="_google_chrome and is_win">
     /** @private */
@@ -46,6 +51,15 @@
     // </if>
   },
 
+  // <if expr="chromeos">
+  /** @override */
+  ready: function() {
+    // TODO(hsuregan): Remove when OS settings migration is complete.
+    this.allowPowerwash_ =
+        this.allowPowerwash_ && this.pageVisibility.powerwash;
+  },
+  // </if>
+
   /**
    * settings.RouteObserverBehavior
    * @param {!settings.Route} route
diff --git a/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
index 0eca6cf..bfe9cd0 100644
--- a/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
+++ b/chrome/browser/resources/welcome/onboarding_welcome/onboarding_welcome_resources.grd
@@ -6,9 +6,9 @@
       <emit emit_type='prepend'></emit>
     </output>
     <output filename="grit/onboarding_welcome_resources_map.cc"
-            type="gzipped_resource_file_map_source" />
+            type="resource_file_map_source" />
     <output filename="grit/onboarding_welcome_resources_map.h"
-            type="gzipped_resource_map_header" />
+            type="resource_map_header" />
     <output filename="onboarding_welcome_resources.pak"
             type="data_package" />
   </outputs>
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index 10c33b6..b00c0b02 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1240,15 +1240,26 @@
 
 void ChromePasswordProtectionService::MaybeReportPasswordReuseDetected(
     content::WebContents* web_contents,
+    const std::string& username,
     ReusedPasswordType reused_password_type,
     bool is_phishing_url) {
+  // When a PasswordFieldFocus event is sent, a PasswordProtectionRequest is
+  // sent which means the password reuse type is unknown. We do not want to
+  // report these events as PasswordReuse events. Also do not send reports for
+  // Gmail accounts.
   bool can_log_password_reuse_event =
       (reused_password_type == PasswordReuseEvent::ENTERPRISE_PASSWORD ||
-       GetSyncAccountType() == PasswordReuseEvent::GSUITE);
+       GetSyncAccountType() == PasswordReuseEvent::GSUITE) &&
+      (reused_password_type !=
+       PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN);
   if (!IsIncognito() && can_log_password_reuse_event) {
+    // User name should only be empty when MaybeStartPasswordFieldOnFocusRequest
+    // is called.
+    std::string username_or_email =
+        username.empty() ? GetAccountInfo().email : username;
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->OnPolicySpecifiedPasswordReuseDetected(
-            web_contents->GetLastCommittedURL(), GetAccountInfo().email,
+            web_contents->GetLastCommittedURL(), username_or_email,
             is_phishing_url);
   }
 }
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.h b/chrome/browser/safe_browsing/chrome_password_protection_service.h
index e0632a3e..6a546d8d 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.h
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -176,7 +176,10 @@
   // If the browser is not incognito and the user is reusing their enterprise
   // password or is a GSuite user, triggers
   // safeBrowsingPrivate.OnPolicySpecifiedPasswordReuseDetected.
+  // |username| can be an email address or a username for a non-GAIA or
+  // saved-password reuse. No validation has been done on it.
   void MaybeReportPasswordReuseDetected(content::WebContents* web_contents,
+                                        const std::string& username,
                                         ReusedPasswordType reused_password_type,
                                         bool is_phishing_url) override;
 
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index 2e88050..bfc4178 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -69,6 +69,7 @@
 const char kTestEmail[] = "foo@example.com";
 const char kTestGmail[] = "foo@gmail.com";
 const char kRedirectURL[] = "http://redirect.com";
+const char kUserName[] = "username";
 
 BrowserContextKeyedServiceFactory::TestingFactory
 GetFakeUserEventServiceFactory() {
@@ -211,7 +212,7 @@
       PasswordReuseEvent::ReusedPasswordType reused_password_type) {
     if (trigger_type == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) {
       request_ = new PasswordProtectionRequest(
-          web_contents(), GURL(kPhishingURL), GURL(), GURL(),
+          web_contents(), GURL(kPhishingURL), GURL(), GURL(), kUserName,
           PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN,
           std::vector<std::string>({"somedomain.com"}), trigger_type, true,
           service_.get(), 0);
@@ -219,7 +220,7 @@
       ASSERT_EQ(LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
                 trigger_type);
       request_ = new PasswordProtectionRequest(
-          web_contents(), GURL(kPhishingURL), GURL(), GURL(),
+          web_contents(), GURL(kPhishingURL), GURL(), GURL(), kUserName,
           reused_password_type, std::vector<std::string>(), trigger_type, true,
           service_.get(), 0);
     }
@@ -235,7 +236,8 @@
     std::unique_ptr<LoginReputationClientResponse> verdict =
         std::make_unique<LoginReputationClientResponse>();
     verdict->set_verdict_type(verdict_type);
-    service_->RequestFinished(request_.get(), false, std::move(verdict));
+    service_->RequestFinished(request_.get(), RequestOutcome::SUCCEEDED,
+                              std::move(verdict));
   }
 
   CoreAccountInfo SetPrimaryAccount(const std::string& email) {
@@ -1004,7 +1006,7 @@
   NavigateAndCommit(GURL(kPasswordReuseURL));
 
   service_->MaybeReportPasswordReuseDetected(
-      web_contents(), PasswordReuseEvent::ENTERPRISE_PASSWORD,
+      web_contents(), kUserName, PasswordReuseEvent::ENTERPRISE_PASSWORD,
       /*is_phishing_url =*/true);
   base::RunLoop().RunUntilIdle();
 
@@ -1012,23 +1014,32 @@
                    OnPolicySpecifiedPasswordReuseDetected::kEventName));
   auto captured_args = event_observer.PassEventArgs().GetList()[0].Clone();
   EXPECT_EQ(kPasswordReuseURL, captured_args.FindKey("url")->GetString());
-  EXPECT_EQ("foo@example.com", captured_args.FindKey("userName")->GetString());
+  EXPECT_EQ(kUserName, captured_args.FindKey("userName")->GetString());
   EXPECT_TRUE(captured_args.FindKey("isPhishingUrl")->GetBool());
 
   // If the reused password is not Enterprise password but the account is
   // GSuite, event should be sent.
   service_->MaybeReportPasswordReuseDetected(
-      web_contents(), PasswordReuseEvent::OTHER_GAIA_PASSWORD,
+      web_contents(), kUserName, PasswordReuseEvent::OTHER_GAIA_PASSWORD,
       /*is_phishing_url =*/true);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_EQ(2, test_event_router_->GetEventCount(
                    OnPolicySpecifiedPasswordReuseDetected::kEventName));
 
+  // If no password is used , no event should be sent.
+  service_->MaybeReportPasswordReuseDetected(
+      web_contents(), kUserName,
+      PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN,
+      /*is_phishing_url =*/true);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(2, test_event_router_->GetEventCount(
+                   OnPolicySpecifiedPasswordReuseDetected::kEventName));
+
   // If user is in incognito mode, no event should be sent.
   service_->ConfigService(true /*incognito*/, false /*SBER*/);
   service_->MaybeReportPasswordReuseDetected(
-      web_contents(), PasswordReuseEvent::ENTERPRISE_PASSWORD,
+      web_contents(), kUserName, PasswordReuseEvent::ENTERPRISE_PASSWORD,
       /*is_phishing_url =*/true);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(2, test_event_router_->GetEventCount(
@@ -1048,7 +1059,7 @@
   NavigateAndCommit(GURL(kPasswordReuseURL));
 
   service_->MaybeReportPasswordReuseDetected(
-      web_contents(), PasswordReuseEvent::ENTERPRISE_PASSWORD,
+      web_contents(), kUserName, PasswordReuseEvent::ENTERPRISE_PASSWORD,
       /*is_phishing_url =*/true);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, test_event_router_->GetEventCount(
@@ -1057,7 +1068,16 @@
   // If user is a Gmail user and not an enterprise password is used , no event
   // should be sent.
   service_->MaybeReportPasswordReuseDetected(
-      web_contents(), PasswordReuseEvent::OTHER_GAIA_PASSWORD,
+      web_contents(), kUserName, PasswordReuseEvent::OTHER_GAIA_PASSWORD,
+      /*is_phishing_url =*/true);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(1, test_event_router_->GetEventCount(
+                   OnPolicySpecifiedPasswordReuseDetected::kEventName));
+
+  // If user is a Gmail user and no password is used , no event should be sent.
+  service_->MaybeReportPasswordReuseDetected(
+      web_contents(), kUserName,
+      PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN,
       /*is_phishing_url =*/true);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, test_event_router_->GetEventCount(
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 8d0f849..51649b88 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -216,8 +216,8 @@
     if (!chrome::FindBrowserWithWebContents(web_contents))
       return;
 
-    chrome::SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
-        profile, GURL("chrome://settings/accountManager"));
+    chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
+        profile, chrome::kAccountManagerSubPage);
     return;
   }
 
diff --git a/chrome/browser/signin/signin_error_notifier_ash.cc b/chrome/browser/signin/signin_error_notifier_ash.cc
index 15fe137a..5cf827d 100644
--- a/chrome/browser/signin/signin_error_notifier_ash.cc
+++ b/chrome/browser/signin/signin_error_notifier_ash.cc
@@ -194,8 +194,9 @@
     // times already). Take users to Account Manager UI directly.
     // Note: If the welcome dialog was shown, we don't need to do anything.
     // Closing that dialog takes users to Account Manager UI.
-    chrome::SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
-        profile_, GURL("chrome://settings/accountManager"));
+
+    chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
+        profile_, chrome::kAccountManagerSubPage);
   }
 }
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
index 822baaf3..ce35848c 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -40,7 +40,6 @@
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_test_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
 #include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
-#include "chrome/browser/ui/ash/session_controller_client_impl.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_dialogs.h"
@@ -187,9 +186,6 @@
   ~LauncherPlatformAppBrowserTest() override {}
 
   void SetUpOnMainThread() override {
-    // Ensure ash starts the session and creates the shelf and controller.
-    SessionControllerClientImpl::FlushForTesting();
-
     controller_ = ChromeLauncherController::instance();
     ASSERT_TRUE(controller_);
     extensions::PlatformAppBrowserTest::SetUpOnMainThread();
@@ -237,9 +233,6 @@
   ash::ShelfModel* shelf_model() { return controller_->shelf_model(); }
 
   void SetUpOnMainThread() override {
-    // Ensure ash starts the session and creates the shelf and controller.
-    SessionControllerClientImpl::FlushForTesting();
-
     controller_ = ChromeLauncherController::instance();
     ASSERT_TRUE(controller_);
     extensions::ExtensionBrowserTest::SetUpOnMainThread();
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.cc b/chrome/browser/ui/ash/session_controller_client_impl.cc
index 36516efb2..df53ce8 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl.cc
+++ b/chrome/browser/ui/ash/session_controller_client_impl.cc
@@ -217,9 +217,9 @@
 }
 
 void SessionControllerClientImpl::Init() {
-  ash::SessionController::Get()->SetClient(this);
+  session_controller_ = ash::SessionController::Get();
+  session_controller_->SetClient(this);
 
-  ConnectToSessionController();
   SendSessionInfoIfChanged();
   SendSessionLengthLimit();
   // User sessions and their order will be sent via UserSessionStateObserver
@@ -465,11 +465,6 @@
   DoSwitchActiveUser(account_id);
 }
 
-// static
-void SessionControllerClientImpl::FlushForTesting() {
-  g_session_controller_client_instance->session_controller_.FlushForTesting();
-}
-
 void SessionControllerClientImpl::OnSessionStateChanged() {
   // Sent the primary user metadata and user session order that are deferred
   // from ActiveUserChanged before update session state.
@@ -572,12 +567,6 @@
   SendUserSession(*user);
 }
 
-void SessionControllerClientImpl::ConnectToSessionController() {
-  content::ServiceManagerConnection::GetForProcess()
-      ->GetConnector()
-      ->BindInterface(ash::mojom::kServiceName, &session_controller_);
-}
-
 void SessionControllerClientImpl::SendSessionInfoIfChanged() {
   SessionManager* const session_manager = SessionManager::Get();
 
@@ -594,7 +583,7 @@
     return;
 
   last_sent_session_info_ = std::move(info);
-  ash::SessionController::Get()->SetSessionInfo(*last_sent_session_info_);
+  session_controller_->SetSessionInfo(*last_sent_session_info_);
 }
 
 void SessionControllerClientImpl::SendUserSession(const User& user) {
@@ -611,7 +600,7 @@
     return;
 
   last_sent_user_session_ = std::move(user_session);
-  ash::SessionController::Get()->UpdateUserSession(*last_sent_user_session_);
+  session_controller_->UpdateUserSession(*last_sent_user_session_);
 }
 
 void SessionControllerClientImpl::SendUserSessionOrder() {
@@ -625,7 +614,7 @@
     user_session_ids.push_back(user_session_id);
   }
 
-  ash::SessionController::Get()->SetUserSessionOrder(user_session_ids);
+  session_controller_->SetUserSessionOrder(user_session_ids);
 }
 
 void SessionControllerClientImpl::SendSessionLengthLimit() {
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.h b/chrome/browser/ui/ash/session_controller_client_impl.h
index 63edf67..111f950b 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl.h
+++ b/chrome/browser/ui/ash/session_controller_client_impl.h
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "ash/public/cpp/session/session_controller_client.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "base/callback_forward.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
@@ -118,9 +117,6 @@
   static void DoSwitchActiveUser(const AccountId& account_id);
   static void DoCycleActiveUser(ash::CycleUserDirection direction);
 
-  // Flushes the mojo pipe to ash.
-  static void FlushForTesting();
-
  private:
   FRIEND_TEST_ALL_PREFIXES(SessionControllerClientImplTest, CyclingThreeUsers);
   FRIEND_TEST_ALL_PREFIXES(SessionControllerClientImplTest, SendUserSession);
@@ -137,9 +133,6 @@
   // Sends the user session info for a given profile.
   void SendUserSessionForProfile(Profile* profile);
 
-  // Connects to the |session_controller_| interface.
-  void ConnectToSessionController();
-
   // Sends session info to ash.
   void SendSessionInfoIfChanged();
 
@@ -158,9 +151,8 @@
   // policy.
   void SendSessionLengthLimit();
 
-  // SessionController interface in ash. Holding the interface pointer keeps the
-  // pipe alive to receive mojo return values.
-  ash::mojom::SessionControllerPtr session_controller_;
+  // SessionController instance in ash.
+  ash::SessionController* session_controller_ = nullptr;
 
   // Whether the primary user session info is sent to ash.
   bool primary_user_session_sent_ = false;
diff --git a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
index 766739460..123708c 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/session_controller_client_impl_unittest.cc
@@ -237,31 +237,24 @@
   UserAddedToSession(second_user);
   UserAddedToSession(third_user);
   user_manager()->SwitchActiveUser(first_user);
-  SessionControllerClientImpl::FlushForTesting();
 
   // Cycle forward.
   const ash::CycleUserDirection forward = ash::CycleUserDirection::NEXT;
   EXPECT_EQ("firstuser@test.com", GetActiveUserEmail());
   SessionControllerClientImpl::DoCycleActiveUser(forward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("seconduser@test.com", GetActiveUserEmail());
   SessionControllerClientImpl::DoCycleActiveUser(forward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("thirduser@test.com", GetActiveUserEmail());
   SessionControllerClientImpl::DoCycleActiveUser(forward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("firstuser@test.com", GetActiveUserEmail());
 
   // Cycle backwards.
   const ash::CycleUserDirection backward = ash::CycleUserDirection::PREVIOUS;
   SessionControllerClientImpl::DoCycleActiveUser(backward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("thirduser@test.com", GetActiveUserEmail());
   SessionControllerClientImpl::DoCycleActiveUser(backward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("seconduser@test.com", GetActiveUserEmail());
   SessionControllerClientImpl::DoCycleActiveUser(backward);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ("firstuser@test.com", GetActiveUserEmail());
 }
 
@@ -406,7 +399,6 @@
   SessionControllerClientImpl client;
   TestSessionController session_controller;
   client.Init();
-  SessionControllerClientImpl::FlushForTesting();
 
   // No user session sent yet.
   EXPECT_EQ(0, session_controller.update_user_session_count());
@@ -422,7 +414,6 @@
           account_id.GetUserEmail()),
       false);
   session_manager_.SetSessionState(SessionState::ACTIVE);
-  SessionControllerClientImpl::FlushForTesting();
 
   // User session was sent.
   EXPECT_EQ(1, session_controller.update_user_session_count());
@@ -433,7 +424,6 @@
 
   // Simulate a request for an update where nothing changed.
   client.SendUserSession(*user_manager()->GetLoggedInUsers()[0]);
-  SessionControllerClientImpl::FlushForTesting();
 
   // Session was not updated because nothing changed.
   EXPECT_EQ(1, session_controller.update_user_session_count());
@@ -444,7 +434,6 @@
   SessionControllerClientImpl client;
   TestSessionController session_controller;
   client.Init();
-  SessionControllerClientImpl::FlushForTesting();
 
   // Simulate the login screen. No user session yet.
   session_manager_.SetSessionState(SessionState::LOGIN_PRIMARY);
@@ -464,7 +453,6 @@
           "child@test.com"),
       false);
   session_manager_.SetSessionState(SessionState::ACTIVE);
-  SessionControllerClientImpl::FlushForTesting();
 
   // The session controller received session info and user session.
   EXPECT_LT(0u, session_controller.last_user_session()->session_id);
@@ -494,7 +482,6 @@
   // Simulate an update to the custodian information.
   prefs->SetString(prefs::kSupervisedUserCustodianEmail, "parent3@test.com");
   client.OnCustodianInfoChanged();
-  SessionControllerClientImpl::FlushForTesting();
 
   // The updated custodian was sent over the mojo interface.
   EXPECT_EQ("parent3@test.com",
@@ -513,12 +500,10 @@
       AccountId::FromUserEmailGaiaId("user@test.com", "2222222222");
   user_manager()->SetOwnerId(owner);
   UserAddedToSession(owner);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_TRUE(
       session_controller.last_user_session()->user_info.is_device_owner);
 
   UserAddedToSession(normal_user);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_FALSE(
       session_controller.last_user_session()->user_info.is_device_owner);
 }
@@ -532,13 +517,11 @@
   const AccountId owner =
       AccountId::FromUserEmailGaiaId("owner@test.com", "1111111111");
   UserAddedToSession(owner);
-  SessionControllerClientImpl::FlushForTesting();
   // The device owner is empty, the current session shouldn't be the owner.
   EXPECT_FALSE(
       session_controller.last_user_session()->user_info.is_device_owner);
 
   user_manager()->SetOwnerId(owner);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_TRUE(
       session_controller.last_user_session()->user_info.is_device_owner);
 }
@@ -548,7 +531,6 @@
   SessionControllerClientImpl client;
   TestSessionController session_controller;
   client.Init();
-  SessionControllerClientImpl::FlushForTesting();
 
   // Simulate login.
   const AccountId account_id(
@@ -560,7 +542,6 @@
           account_id.GetUserEmail()),
       false);
   session_manager_.SetSessionState(SessionState::ACTIVE);
-  SessionControllerClientImpl::FlushForTesting();
 
   // Simulate the notification that the profile is ready.
   TestingProfile* const user_profile = CreateTestingProfile(user);
@@ -570,17 +551,13 @@
   PrefService* const user_prefs = user_profile->GetPrefs();
 
   user_prefs->SetBoolean(ash::prefs::kAllowScreenLock, true);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_TRUE(session_controller.last_session_info()->can_lock_screen);
   user_prefs->SetBoolean(ash::prefs::kAllowScreenLock, false);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_FALSE(session_controller.last_session_info()->can_lock_screen);
   user_prefs->SetBoolean(ash::prefs::kEnableAutoScreenLock, true);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_TRUE(
       session_controller.last_session_info()->should_lock_screen_automatically);
   user_prefs->SetBoolean(ash::prefs::kEnableAutoScreenLock, false);
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_FALSE(
       session_controller.last_session_info()->should_lock_screen_automatically);
 }
@@ -590,7 +567,6 @@
   SessionControllerClientImpl client;
   TestSessionController session_controller;
   client.Init();
-  SessionControllerClientImpl::FlushForTesting();
 
   // By default there is no session length limit.
   EXPECT_TRUE(session_controller.last_session_length_limit().is_zero());
@@ -603,7 +579,6 @@
   local_state->SetInteger(prefs::kSessionLengthLimit,
                           length_limit.InMilliseconds());
   local_state->SetInt64(prefs::kSessionStartTime, start_time.ToInternalValue());
-  SessionControllerClientImpl::FlushForTesting();
   EXPECT_EQ(length_limit, session_controller.last_session_length_limit());
   EXPECT_EQ(start_time, session_controller.last_session_start_time());
 }
diff --git a/chrome/browser/ui/ash/test_session_controller.cc b/chrome/browser/ui/ash/test_session_controller.cc
index b36722c..6afab34 100644
--- a/chrome/browser/ui/ash/test_session_controller.cc
+++ b/chrome/browser/ui/ash/test_session_controller.cc
@@ -6,31 +6,8 @@
 
 #include <utility>
 
-#include "ash/public/interfaces/constants.mojom.h"
-#include "content/public/common/service_manager_connection.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/service_filter.h"
-
-TestSessionController::TestSessionController() {
-  CHECK(content::ServiceManagerConnection::GetForProcess())
-      << "ServiceManager is uninitialized. Did you forget to create a "
-         "content::TestServiceManagerContext?";
-  content::ServiceManagerConnection::GetForProcess()
-      ->GetConnector()
-      ->OverrideBinderForTesting(
-          service_manager::ServiceFilter::ByName(ash::mojom::kServiceName),
-          ash::mojom::SessionController::Name_,
-          base::BindRepeating(&TestSessionController::Bind,
-                              base::Unretained(this)));
-}
-
-TestSessionController::~TestSessionController() {
-  content::ServiceManagerConnection::GetForProcess()
-      ->GetConnector()
-      ->ClearBinderOverrideForTesting(
-          service_manager::ServiceFilter::ByName(ash::mojom::kServiceName),
-          ash::mojom::SessionController::Name_);
-}
+TestSessionController::TestSessionController() = default;
+TestSessionController::~TestSessionController() = default;
 
 void TestSessionController::SetClient(ash::SessionControllerClient* client) {}
 
@@ -92,8 +69,8 @@
 
 void TestSessionController::AddSessionActivationObserverForAccountId(
     const AccountId& account_id,
-    ash::mojom::SessionActivationObserverPtr observer) {}
+    ash::SessionActivationObserver* observer) {}
 
-void TestSessionController::Bind(mojo::ScopedMessagePipeHandle handle) {
-  binding_.Bind(ash::mojom::SessionControllerRequest(std::move(handle)));
-}
+void TestSessionController::RemoveSessionActivationObserverForAccountId(
+    const AccountId& account_id,
+    ash::SessionActivationObserver* observer) {}
diff --git a/chrome/browser/ui/ash/test_session_controller.h b/chrome/browser/ui/ash/test_session_controller.h
index 212c2c7..0cefb56 100644
--- a/chrome/browser/ui/ash/test_session_controller.h
+++ b/chrome/browser/ui/ash/test_session_controller.h
@@ -9,20 +9,11 @@
 #include <vector>
 
 #include "ash/public/cpp/session/session_controller.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "base/macros.h"
 #include "base/optional.h"
-#include "mojo/public/cpp/bindings/binding.h"
 
-// Test implementation of ash's mojo SessionController interface.
-//
-// Registers itself to ServiceManager on construction and deregisters
-// on destruction.
-//
-// Note: A ServiceManagerConnection must be initialized before constructing this
-// object. Consider using content::TestServiceManagerContext on your tests.
-class TestSessionController : public ash::SessionController,
-                              public ash::mojom::SessionController {
+// Test implementation of ash's SessionController interface.
+class TestSessionController : public ash::SessionController {
  public:
   TestSessionController();
   ~TestSessionController() override;
@@ -55,8 +46,6 @@
   void UpdateUserSession(const ash::UserSession& user_session) override;
   void SetUserSessionOrder(
       const std::vector<uint32_t>& user_session_order) override;
-
-  // ash::mojom::SessionController:
   void PrepareForLock(PrepareForLockCallback callback) override;
   void StartLock(StartLockCallback callback) override;
   void NotifyChromeLockAnimationsComplete() override;
@@ -73,18 +62,18 @@
       const std::string& user_email) override;
   void AddSessionActivationObserverForAccountId(
       const AccountId& account_id,
-      ash::mojom::SessionActivationObserverPtr observer) override;
+      ash::SessionActivationObserver* observer) override;
+  void RemoveSessionActivationObserverForAccountId(
+      const AccountId& account_id,
+      ash::SessionActivationObserver* observer) override;
 
  private:
-  void Bind(mojo::ScopedMessagePipeHandle handle);
-
   base::Optional<ash::SessionInfo> last_session_info_;
   base::Optional<ash::UserSession> last_user_session_;
   base::TimeDelta last_session_length_limit_;
   base::TimeTicks last_session_start_time_;
   int update_user_session_count_ = 0;
   int lock_animation_complete_call_count_ = 0;
-  mojo::Binding<ash::mojom::SessionController> binding_{this};
 
   DISALLOW_COPY_AND_ASSIGN(TestSessionController);
 };
diff --git a/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm b/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
index 233ba61..e05cba5 100644
--- a/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_mac_browsertest.mm
@@ -15,7 +15,9 @@
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/browser/notification_service.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/test/test_utils.h"
+#include "ui/base/test/ns_ax_tree_validator.h"
 
 // Test harness for Mac-specific behaviors of BrowserWindow.
 class BrowserWindowMacTest : public InProcessBrowserTest {
@@ -61,3 +63,33 @@
   // which currently asks |super|. That is, NSWindow. Which says YES.
   EXPECT_TRUE([window validateUserInterfaceItem:bookmark_menu_item]);
 }
+
+class BrowserWindowMacA11yTest : public BrowserWindowMacTest {
+ public:
+  BrowserWindowMacA11yTest() = default;
+  ~BrowserWindowMacA11yTest() override = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    BrowserWindowMacTest::SetUpCommandLine(command_line);
+    command_line->AppendSwitch(switches::kForceRendererAccessibility);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BrowserWindowMacA11yTest);
+};
+
+IN_PROC_BROWSER_TEST_F(BrowserWindowMacA11yTest, A11yTreeIsWellFormed) {
+  NSWindow* window = browser()->window()->GetNativeWindow().GetNativeNSWindow();
+  size_t nodes_visited = 0;
+  base::Optional<ui::NSAXTreeProblemDetails> details =
+      ui::ValidateNSAXTree(window, &nodes_visited);
+  EXPECT_FALSE(details.has_value()) << details->ToString();
+
+  // There should be at least a handful of AX nodes in the tree - fail this test
+  // if for some reason (eg) the window has no children, which would otherwise
+  // be a well-formed AX tree.
+  EXPECT_GE(nodes_visited, 10U);
+
+  if (HasFailure())
+    ui::PrintNSAXTree(window);
+}
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.cc b/chrome/browser/ui/search/ntp_user_data_logger.cc
index 60be683..cdc1842 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger.cc
@@ -562,12 +562,8 @@
     UMA_HISTOGRAM_LOAD_TIME("NewTabPage.TilesReceivedTime.Web",
                             tiles_received_time_);
     UMA_HISTOGRAM_LOAD_TIME("NewTabPage.LoadTime.Web", load_time);
-    // Further split between Google and non-Google.
-    if (is_google) {
-      UMA_HISTOGRAM_LOAD_TIME("NewTabPage.LoadTime.Web.Google", load_time);
-    } else {
-      UMA_HISTOGRAM_LOAD_TIME("NewTabPage.LoadTime.Web.Other", load_time);
-    }
+    // Only third-party NTPs can be loaded from the web.
+    UMA_HISTOGRAM_LOAD_TIME("NewTabPage.LoadTime.Web.Other", load_time);
   } else {
     UMA_HISTOGRAM_LOAD_TIME("NewTabPage.TilesReceivedTime.LocalNTP",
                             tiles_received_time_);
diff --git a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
index 88a2705..a57ff5c8 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
@@ -775,47 +775,6 @@
                   1)));
 }
 
-TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPGoogle) {
-  base::HistogramTester histogram_tester;
-
-  TestNTPUserDataLogger logger(GURL("https://www.google.com/_/chrome/newtab"));
-  logger.is_google_ = true;
-
-  base::TimeDelta delta_tiles_received = base::TimeDelta::FromMilliseconds(10);
-  base::TimeDelta delta_tiles_loaded = base::TimeDelta::FromMilliseconds(100);
-
-  // Send the ALL_TILES_RECEIVED event.
-  logger.LogEvent(NTP_ALL_TILES_RECEIVED, delta_tiles_received);
-
-  // Send the ALL_TILES_LOADED event, this should trigger emitting histograms.
-  logger.LogEvent(NTP_ALL_TILES_LOADED, delta_tiles_loaded);
-
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime"), SizeIs(1));
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP"),
-              IsEmpty());
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web"),
-              SizeIs(1));
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web.Google"),
-              SizeIs(1));
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web.Other"),
-              IsEmpty());
-
-  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime",
-                                         delta_tiles_loaded, 1);
-  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web",
-                                         delta_tiles_loaded, 1);
-  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web.Google",
-                                         delta_tiles_loaded, 1);
-
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples(
-          "NewTabPage.CustomizationAvailability.Backgrounds"),
-      ElementsAre(Bucket(
-          static_cast<int>(
-              BackgroundCustomization::BACKGROUND_CUSTOMIZATION_AVAILABLE),
-          1)));
-}
-
 TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPOther) {
   base::HistogramTester histogram_tester;
 
@@ -934,7 +893,8 @@
 TEST_F(NTPUserDataLoggerTest, ShouldRecordCustomizationActionFromNTPGoogle) {
   base::HistogramTester histogram_tester;
 
-  TestNTPUserDataLogger logger(GURL("https://www.google.com/_/chrome/newtab"));
+  GURL local_ntp(chrome::kChromeSearchLocalNtpUrl);
+  TestNTPUserDataLogger logger(local_ntp);
   logger.is_google_ = true;
 
   base::TimeDelta delta_tiles_received = base::TimeDelta::FromMilliseconds(10);
@@ -952,19 +912,21 @@
 
   EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime"), SizeIs(1));
   EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP"),
-              IsEmpty());
+              SizeIs(1));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP.Google"),
+      SizeIs(1));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP.Other"),
+      IsEmpty());
   EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web"),
-              SizeIs(1));
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web.Google"),
-              SizeIs(1));
-  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web.Other"),
               IsEmpty());
 
   histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime",
                                          delta_tiles_loaded, 1);
-  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web",
+  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP",
                                          delta_tiles_loaded, 1);
-  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web.Google",
+  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP.Google",
                                          delta_tiles_loaded, 1);
 
   EXPECT_THAT(
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
index 243a46d..7bdbd6a5 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
@@ -456,16 +456,16 @@
     if (!browser())
       return icon_view;
 
+    BrowserView* browser_view =
+        BrowserView::GetBrowserViewForBrowser(browser());
     if (icon_in_status_chip) {
       ToolbarPageActionIconContainerView*
           toolbar_page_action_icon_container_view =
-              static_cast<ToolbarPageActionIconContainerView*>(
-                  browser()->window()->GetToolbarPageActionIconContainer());
+              browser_view->toolbar()->toolbar_page_action_container();
       icon_view = toolbar_page_action_icon_container_view
                       ->local_card_migration_icon_view();
     } else {
-      LocationBarView* location_bar_view =
-          static_cast<LocationBarView*>(browser()->window()->GetLocationBar());
+      LocationBarView* location_bar_view = browser_view->GetLocationBarView();
       icon_view = location_bar_view->local_card_migration_icon_view();
     }
     CHECK(icon_view);
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index c5598a1f..e78c4ddbc 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -681,18 +681,18 @@
       return nullptr;
 
     SaveCardIconView* icon_view = nullptr;
+    BrowserView* browser_view =
+        BrowserView::GetBrowserViewForBrowser(browser());
     if (base::FeatureList::IsEnabled(
             features::kAutofillEnableToolbarStatusChip)) {
       ToolbarPageActionIconContainerView*
           toolbar_page_action_icon_container_view =
-              static_cast<ToolbarPageActionIconContainerView*>(
-                  browser()->window()->GetToolbarPageActionIconContainer());
+              browser_view->toolbar()->toolbar_page_action_container();
       DCHECK(toolbar_page_action_icon_container_view->save_card_icon_view());
       icon_view =
           toolbar_page_action_icon_container_view->save_card_icon_view();
     } else {
-      LocationBarView* location_bar_view =
-          static_cast<LocationBarView*>(browser()->window()->GetLocationBar());
+      LocationBarView* location_bar_view = browser_view->GetLocationBarView();
       DCHECK(location_bar_view->save_credit_card_icon_view());
       icon_view = location_bar_view->save_credit_card_icon_view();
     }
diff --git a/chrome/browser/ui/webui/browser_switcher/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switcher/browser_switch_ui.cc
index 802c1bc..ef8dfacd 100644
--- a/chrome/browser/ui/webui/browser_switcher/browser_switch_ui.cc
+++ b/chrome/browser/ui/webui/browser_switcher/browser_switch_ui.cc
@@ -58,6 +58,29 @@
   return true;
 }
 
+// Returns a dictionary like:
+//
+// {
+//   "sitelist": ["example.com", ...],
+//   "greylist": ["example.net", ...]
+// }
+std::unique_ptr<base::Value> RuleSetToDict(
+    const browser_switcher::RuleSet& ruleset) {
+  auto sitelist = std::make_unique<base::ListValue>();
+  for (const std::string& rule : ruleset.sitelist)
+    sitelist->GetList().emplace_back(rule);
+
+  auto greylist = std::make_unique<base::ListValue>();
+  for (const std::string& rule : ruleset.greylist)
+    greylist->GetList().emplace_back(rule);
+
+  auto dict = std::make_unique<base::DictionaryValue>();
+  dict->Set("sitelist", std::move(sitelist));
+  dict->Set("greylist", std::move(greylist));
+
+  return dict;
+}
+
 browser_switcher::BrowserSwitcherService* GetBrowserSwitcherService(
     content::WebUI* web_ui) {
   return browser_switcher::BrowserSwitcherServiceFactory::GetForBrowserContext(
@@ -116,8 +139,16 @@
                           IDR_BROWSER_SWITCHER_BROWSER_SWITCHER_PROXY_HTML);
   source->AddResourcePath("browser_switcher_proxy.js",
                           IDR_BROWSER_SWITCHER_BROWSER_SWITCHER_PROXY_JS);
-
   source->SetDefaultResource(IDR_BROWSER_SWITCHER_BROWSER_SWITCH_HTML);
+
+  // Setup chrome://browser-switch/internals debug UI.
+  source->AddResourcePath("internals/browser_switcher_internals.js",
+                          IDR_BROWSER_SWITCHER_INTERNALS_JS);
+  source->AddResourcePath("internals/browser_switcher_internals.html",
+                          IDR_BROWSER_SWITCHER_INTERNALS_HTML);
+  source->AddResourcePath("internals/", IDR_BROWSER_SWITCHER_INTERNALS_HTML);
+  source->AddResourcePath("internals", IDR_BROWSER_SWITCHER_INTERNALS_HTML);
+
   source->SetJsonPath("strings.js");
 
   return source;
@@ -143,6 +174,19 @@
   // Navigates to the New Tab Page.
   void HandleGotoNewTabPage(const base::ListValue* args);
 
+  // Resolves a promise with a JSON object with all the LBS rulesets, formatted
+  // like this:
+  //
+  // {
+  //   "gpo": {
+  //     "sitelist": ["example.com", ...],
+  //     "greylist": [...]
+  //   },
+  //   "ieem": { "sitelist": [...], "greylist": [...] },
+  //   "external": { "sitelist": [...], "greylist": [...] }
+  // }
+  void HandleGetAllRulesets(const base::ListValue* args);
+
   DISALLOW_COPY_AND_ASSIGN(BrowserSwitchHandler);
 };
 
@@ -159,6 +203,10 @@
       "gotoNewTabPage",
       base::BindRepeating(&BrowserSwitchHandler::HandleGotoNewTabPage,
                           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "getAllRulesets",
+      base::BindRepeating(&BrowserSwitchHandler::HandleGetAllRulesets,
+                          base::Unretained(this)));
 }
 
 void BrowserSwitchHandler::HandleLaunchAlternativeBrowserAndCloseTab(
@@ -209,6 +257,24 @@
   GotoNewTabPage(web_ui()->GetWebContents());
 }
 
+void BrowserSwitchHandler::HandleGetAllRulesets(const base::ListValue* args) {
+  DCHECK(args);
+  AllowJavascript();
+
+  auto* service = GetBrowserSwitcherService(web_ui());
+
+  base::DictionaryValue retval;
+  auto gpo_dict = RuleSetToDict(service->prefs().GetRules());
+  retval.Set("gpo", std::move(gpo_dict));
+  auto ieem_dict = RuleSetToDict(*service->sitelist()->GetIeemSitelist());
+  retval.Set("ieem", std::move(ieem_dict));
+  auto external_dict =
+      RuleSetToDict(*service->sitelist()->GetExternalSitelist());
+  retval.Set("external", std::move(external_dict));
+
+  ResolveJavascriptCallback(args->GetList()[0], retval);
+}
+
 }  // namespace
 
 BrowserSwitchUI::BrowserSwitchUI(content::WebUI* web_ui)
@@ -218,7 +284,7 @@
   DarkModeHandler::Initialize(web_ui, data_source);
   web_ui->AddMessageHandler(std::make_unique<BrowserSwitchHandler>());
 
-  // Set up the about:browser-switch source.
+  // Set up the chrome://browser-switch source.
   Profile* profile = Profile::FromWebUI(web_ui);
   content::WebUIDataSource::Add(profile, data_source);
 }
diff --git a/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc b/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
index 977f24ae..77307020 100644
--- a/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/account_manager_welcome_dialog.cc
@@ -65,9 +65,8 @@
 
 void AccountManagerWelcomeDialog::OnDialogClosed(
     const std::string& json_retval) {
-  chrome::SettingsWindowManager::GetInstance()->ShowChromePageForProfile(
-      ProfileManager::GetActiveUserProfile(),
-      GURL("chrome://settings/accountManager"));
+  chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
+      ProfileManager::GetActiveUserProfile(), chrome::kAccountManagerSubPage);
 
   SystemWebDialogDelegate::OnDialogClosed(json_retval);
 }
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index a12e709..eb1d7d6 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -202,9 +202,22 @@
   }
 
   printer_configurer_->SetUpPrinter(
-      *printer, base::BindOnce(&LocalPrinterHandlerChromeos::HandlePrinterSetup,
-                               weak_factory_.GetWeakPtr(), *printer,
-                               std::move(cb), printer->IsUsbProtocol()));
+      *printer,
+      base::BindOnce(&LocalPrinterHandlerChromeos::OnPrinterInstalled,
+                     weak_factory_.GetWeakPtr(), *printer, std::move(cb)));
+}
+
+void LocalPrinterHandlerChromeos::OnPrinterInstalled(
+    const chromeos::Printer& printer,
+    GetCapabilityCallback cb,
+    chromeos::PrinterSetupResult result) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (result == chromeos::PrinterSetupResult::kSuccess) {
+    printers_manager_->PrinterInstalled(printer, true /*is_automatic*/);
+  }
+
+  HandlePrinterSetup(printer, std::move(cb), printer.IsUsbProtocol(), result);
 }
 
 void LocalPrinterHandlerChromeos::HandlePrinterSetup(
@@ -223,7 +236,6 @@
         chromeos::PrinterConfigurer::RecordUsbPrinterSetupSource(
             chromeos::UsbPrinterSetupSource::kPrintPreview);
       }
-      printers_manager_->PrinterInstalled(printer, true /*is_automatic*/);
       // fetch settings on the blocking pool and invoke callback.
       FetchCapabilities(printer, GetNativePrinterPolicies(), std::move(cb));
       return;
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
index edca6f7..5a124f8 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.h
@@ -65,6 +65,10 @@
   // |profile_|.
   base::Value GetNativePrinterPolicies() const;
 
+  void OnPrinterInstalled(const chromeos::Printer& printer,
+                          GetCapabilityCallback cb,
+                          chromeos::PrinterSetupResult result);
+
   void HandlePrinterSetup(const chromeos::Printer& printer,
                           GetCapabilityCallback cb,
                           bool record_usb_setup_source,
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc
index d9624bff..6f0bac4 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos_unittest.cc
@@ -81,7 +81,7 @@
     return printers_.Get(printer_class);
   }
 
-  void UpdateSavedPrinter(const Printer& printer) override {}
+  void SavePrinter(const Printer& printer) override {}
   void RemoveSavedPrinter(const std::string& printer_id) override {}
   void AddObserver(CupsPrintersManager::Observer* observer) override {}
   void RemoveObserver(CupsPrintersManager::Observer* observer) override {}
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index af7f064..dac4a1c 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -725,6 +725,7 @@
                                 printer.GetProtocol(), Printer::kProtocolMax);
       PRINTER_LOG(USER) << "Performing printer setup";
       printers_manager_->PrinterInstalled(printer, is_automatic);
+      printers_manager_->SavePrinter(printer);
       if (printer.IsUsbProtocol()) {
         // Record UMA for USB printer setup source.
         PrinterConfigurer::RecordUsbPrinterSetupSource(
@@ -733,7 +734,7 @@
       return;
     case PrinterSetupResult::kEditSuccess:
       PRINTER_LOG(USER) << "Printer updated";
-      printers_manager_->UpdateSavedPrinter(printer);
+      printers_manager_->SavePrinter(printer);
       return;
     case PrinterSetupResult::kPpdNotFound:
       PRINTER_LOG(ERROR) << "Could not locate requested PPD";
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
index 41ee571..f040ea2 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
@@ -63,7 +63,7 @@
     return {};
   }
 
-  void UpdateSavedPrinter(const Printer& printer) override {}
+  void SavePrinter(const Printer& printer) override {}
   void RemoveSavedPrinter(const std::string& printer_id) override {}
   void AddObserver(CupsPrintersManager::Observer* observer) override {}
   void RemoveObserver(CupsPrintersManager::Observer* observer) override {}
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 d622de6..8b18a03 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -585,6 +585,7 @@
 #else
     {"resetToDefaultTheme", IDS_SETTINGS_RESET_TO_DEFAULT_THEME},
 #endif
+    {"chromeColors", IDS_SETTINGS_CHROME_COLORS},
     {"showHomeButton", IDS_SETTINGS_SHOW_HOME_BUTTON},
     {"showBookmarksBar", IDS_SETTINGS_SHOW_BOOKMARKS_BAR},
     {"homePageNtp", IDS_SETTINGS_HOME_PAGE_NTP},
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 6e4976e..7332b5ca 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -202,9 +202,6 @@
   // TODO(950007): Remove this when SplitSettings is the default and there are
   // no Chrome OS settings in the browser settings page.
   InitOSWebUIHandlers(profile, web_ui, html_source);
-
-  AddSettingsPageUIHandler(
-      std::make_unique<chromeos::settings::ChangePictureHandler>());
 #else
   AddSettingsPageUIHandler(std::make_unique<DefaultBrowserHandler>());
   AddSettingsPageUIHandler(std::make_unique<ManageProfileHandler>(profile));
@@ -365,6 +362,9 @@
   }
 
   web_ui->AddMessageHandler(
+      std::make_unique<chromeos::settings::ChangePictureHandler>());
+
+  web_ui->AddMessageHandler(
       std::make_unique<chromeos::settings::AccessibilityHandler>(web_ui));
   web_ui->AddMessageHandler(
       std::make_unique<chromeos::settings::AndroidAppsHandler>(profile));
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 80acafa..b347b2c 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -348,6 +348,7 @@
 #if defined(OS_CHROMEOS)
 // NOTE: Add new OS settings to IsOSSettingsSubPage() below.
 const char kAccessibilitySubPage[] = "accessibility";
+const char kAccountManagerSubPage[] = "accountManager";
 const char kAndroidAppsDetailsSubPage[] = "androidApps/details";
 const char kAssistantSubPage[] = "googleAssistant";
 const char kBluetoothSubPage[] = "bluetoothDevices";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index e375472..756a7fd 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -312,6 +312,7 @@
 #if defined(OS_CHROMEOS)
 // Entry points for OS settings sub-pages.
 extern const char kAccessibilitySubPage[];
+extern const char kAccountManagerSubPage[];
 extern const char kAndroidAppsDetailsSubPage[];
 extern const char kAssistantSubPage[];
 extern const char kBluetoothSubPage[];
diff --git a/chrome/installer/mac/BUILD.gn b/chrome/installer/mac/BUILD.gn
index b284886..d55edb8 100644
--- a/chrome/installer/mac/BUILD.gn
+++ b/chrome/installer/mac/BUILD.gn
@@ -6,6 +6,7 @@
 import("//build/config/mac/base_rules.gni")
 import("//build/util/branding.gni")
 import("//build/util/version.gni")
+import("//chrome/process_version_rc_template.gni")
 
 group("mac") {
   public_deps = [
@@ -62,10 +63,54 @@
   ]
 }
 
+process_version_rc_template("sign_config") {
+  visibility = [ ":copy_signing" ]
+
+  template_file = "signing/config.py.in"
+
+  output = "$_packaging_dir/signing/config.py"
+
+  _full_target_name = get_label_info(target_name, "label_no_toolchain")
+  _file_path = rebase_path(template_file)
+
+  extra_args = [
+    "-e",
+    "GEN_HEADER=\"THIS FILE IS AUTOMATICALLY GENERATED BY $_full_target_name.\n# The original copy is at $_file_path.\n\"",
+  ]
+}
+
+_mac_signing_sources = [
+  "signing/__init__.py",
+  "signing/commands.py",
+  "signing/model.py",
+  "signing/modification.py",
+  "signing/pipeline.py",
+  "signing/signing.py",
+]
+
+copy("copy_signing") {
+  visibility = [ ":copies" ]
+
+  deps = [
+    ":sign_config",
+  ]
+
+  sources = _mac_signing_sources
+
+  if (is_chrome_branded) {
+    sources += [ "internal/internal_config.py" ]
+  }
+
+  outputs = [
+    "$_packaging_dir/signing/{{source_file_part}}",
+  ]
+}
+
 copy("copies") {
   visibility = [ ":mac" ]
 
   deps = [
+    ":copy_signing",
     ":copy_variables",
     "//chrome:entitlements",
     "//chrome/installer/mac/third_party/bsdiff:goobsdiff",
@@ -86,6 +131,7 @@
     "dirpatcher.sh",
     "dmgdiffer.sh",
     "pkg-dmg",
+    "sign_chrome.py",
     "sign_installer_tools.sh",
   ]
 
@@ -115,25 +161,21 @@
 }
 
 group("mac_signing_tests") {
-  data = [
-    "signing/__init__.py",
-    "signing/commands.py",
-    "signing/config.py.in",
-    "signing/model.py",
-    "signing/model_test.py",
-    "signing/modification.py",
-    "signing/modification_test.py",
-    "signing/run_mac_signing_tests.py",
-    "signing/signing.py",
-    "signing/signing_test.py",
-    "signing/test_common.py",
-    "signing/test_config.py",
+  data = _mac_signing_sources + [
+           "signing/config.py.in",
+           "signing/model_test.py",
+           "signing/modification_test.py",
+           "signing/pipeline_test.py",
+           "signing/run_mac_signing_tests.py",
+           "signing/signing_test.py",
+           "signing/test_common.py",
+           "signing/test_config.py",
 
-    # The run_isolated_script_test.py script and its dependencies.
-    "//testing/scripts/run_isolated_script_test.py",
-    "//testing/scripts/common.py",
-    "//testing/xvfb.py",
-    "//testing/test_env.py",
-    "//third_party/catapult/third_party/typ/",
-  ]
+           # The run_isolated_script_test.py script and its dependencies.
+           "//testing/scripts/run_isolated_script_test.py",
+           "//testing/scripts/common.py",
+           "//testing/xvfb.py",
+           "//testing/test_env.py",
+           "//third_party/catapult/third_party/typ/",
+         ]
 }
diff --git a/chrome/installer/mac/sign_chrome.py b/chrome/installer/mac/sign_chrome.py
new file mode 100755
index 0000000..964cd09b
--- /dev/null
+++ b/chrome/installer/mac/sign_chrome.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import os.path
+import sys
+
+sys.path.append(os.path.dirname(__file__))
+
+from signing import config, model, pipeline
+
+
+def create_config(identity, keychain, development):
+    """Creates the |model.CodeSignConfig| for the signing operations.
+
+    If |development| is True, the config will be modified to not require
+    restricted internal assets, nor will the products be required to match
+    specific certificate hashes.
+
+    Args:
+        identity: The code signing identity to use.
+        keychain: Optional path to the keychain file, in which |identity|
+            will be searched for.
+        development: Boolean indicating whether or not to modify the chosen
+            config for development testing.
+
+    Returns:
+        An instance of |model.CodeSignConfig|.
+    """
+    config_class = config.CodeSignConfig
+    try:
+        import signing.internal_config
+        config_class = signing.internal_config.InternalCodeSignConfig
+    except ImportError as e:
+        # If the build specified Google Chrome as the product, then the
+        # internal config has to be available.
+        if config_class(identity, keychain).product == 'Google Chrome':
+            raise e
+
+    if development:
+
+        class DevelopmentCodeSignConfig(config_class):
+
+            @property
+            def codesign_requirements_basic(self):
+                return ''
+
+            @property
+            def provisioning_profile_basename(self):
+                return None
+
+            @property
+            def run_spctl_assess(self):
+                return False
+
+        config_class = DevelopmentCodeSignConfig
+
+    return config_class(identity, keychain)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description='Code sign and package Chrome for channel distribution.')
+    parser.add_argument(
+        '--keychain', help='The keychain to load the identity from.')
+    parser.add_argument(
+        '--identity', required=True, help='The identity to sign with.')
+    parser.add_argument('--development', action='store_true',
+            help='The specified identity is for development. ' \
+                 'Certain codesign requirements will be omitted.')
+    parser.add_argument('--input', required=True,
+            help='Path to the input directory. The input directory should ' \
+                    'contain the products to sign, as well as the Packaging ' \
+                    'directory.')
+    parser.add_argument('--output', required=True,
+            help='Path to the output directory. The signed DMG products and ' \
+                    'installer tools will be placed here.')
+    parser.add_argument(
+        '--no-dmg',
+        action='store_true',
+        help='Only sign Chrome and do not package the bundle into a DMG.')
+    args = parser.parse_args()
+
+    config = create_config(args.identity, args.keychain, args.development)
+    paths = model.Paths(args.input, args.output, None)
+
+    pipeline.sign_all(paths, config, package_dmg=not args.no_dmg)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/chrome/installer/mac/signing/pipeline.py b/chrome/installer/mac/signing/pipeline.py
new file mode 100644
index 0000000..ac3cd9f
--- /dev/null
+++ b/chrome/installer/mac/signing/pipeline.py
@@ -0,0 +1,164 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+The pipeline module orchestrates the entire signing process, which includes:
+    1. Customizing build products for release channels.
+    2. Code signing the application bundle and all of its nested code.
+    3. Producing a packaged DMG.
+    4. Signing and packaging the installer tools.
+"""
+
+import os.path
+
+from . import commands, model, modification, signing
+
+
+def _package_dmg(paths, dist, config):
+    """Packages a Chrome application bundle into a DMG.
+
+    Args:
+        paths: A |model.Paths| object.
+        dist: The |model.Distribution| for which the product was customized.
+        config: The |config.CodeSignConfig| object.
+
+    Returns:
+        A path to the produced DMG file.
+    """
+    packaging_dir = paths.packaging_dir(config)
+
+    if dist.channel_customize:
+        dsstore_file = 'chrome_{}_dmg_dsstore'.format(dist.channel)
+        icon_file = 'chrome_{}_dmg_icon.icns'.format(dist.channel)
+    else:
+        dsstore_file = 'chrome_dmg_dsstore'
+        icon_file = 'chrome_dmg_icon.icns'
+
+    dmg_path = os.path.join(paths.output, '{}.dmg'.format(config.dmg_basename))
+    app_path = os.path.join(paths.work, config.app_dir)
+
+    # A locally-created empty directory is more trustworthy than /var/empty.
+    empty_dir = os.path.join(paths.work, 'empty')
+    commands.make_dir(empty_dir)
+
+    # Make the disk image. Don't include any customized name fragments in
+    # --volname because the .DS_Store expects the volume name to be constant.
+    # Don't put a name on the /Applications symbolic link because the same disk
+    # image is used for all languages.
+    # yapf: disable
+    commands.run_command([
+        os.path.join(packaging_dir, 'pkg-dmg'),
+        '--verbosity', '0',
+        '--tempdir', paths.work,
+        '--source', empty_dir,
+        '--target', dmg_path,
+        '--format', 'UDBZ',
+        '--volname', config.app_product,
+        '--icon', os.path.join(packaging_dir, icon_file),
+        '--copy', '{}:/'.format(app_path),
+        '--copy',
+            '{}/keystone_install.sh:/.keystone_install'.format(packaging_dir),
+        '--mkdir', '.background',
+        '--copy',
+            '{}/chrome_dmg_background.png:/.background/background.png'.format(
+                packaging_dir),
+        '--copy', '{}/{}:/.DS_Store'.format(packaging_dir, dsstore_file),
+        '--symlink', '/Applications:/ ',
+    ])
+    # yapf: enable
+
+    return dmg_path
+
+
+def _package_installer_tools(paths, config):
+    """Signs and packages all the installer tools, which are not shipped to end-
+    users.
+
+    Args:
+        paths: A |model.Paths| object.
+        config: The |config.CodeSignConfig| object.
+    """
+    DIFF_TOOLS = 'diff_tools'
+
+    tools_to_sign = signing.get_installer_tools(config)
+    other_tools = (
+        'dirdiffer.sh',
+        'dirpatcher.sh',
+        'dmgdiffer.sh',
+        'keystone_install.sh',
+        'pkg-dmg',
+    )
+
+    with commands.WorkDirectory(paths) as paths:
+        diff_tools_dir = os.path.join(paths.work, DIFF_TOOLS)
+        commands.make_dir(diff_tools_dir)
+
+        for part in tools_to_sign.values():
+            commands.copy_files(
+                os.path.join(paths.input, part.path), diff_tools_dir)
+            part.path = os.path.join(DIFF_TOOLS, os.path.basename(part.path))
+            signing.sign_part(paths, config, part)
+
+        for part in tools_to_sign.values():
+            signing.verify_part(paths, part)
+
+        for tool in other_tools:
+            commands.copy_files(
+                os.path.join(paths.packaging_dir(config), tool), diff_tools_dir)
+
+        zip_file = os.path.join(paths.output, DIFF_TOOLS + '.zip')
+        commands.run_command(['zip', '-9ry', zip_file, DIFF_TOOLS],
+                             cwd=paths.work)
+
+
+def sign_all(orig_paths, config, package_dmg=True):
+    """For each distribution in |config|, performs customization, signing, and
+    DMG packaging and places the resulting signed DMG in |orig_paths.output|.
+    The |paths.input| must contain the products to customize and sign.
+
+    Args:
+        oring_paths: A |model.Paths| object.
+        config: The |config.CodeSignConfig| object.
+        package_dmg: If True, the signed application bundle will be packaged
+            into a DMG, which will also be signed. If False, the signed app
+            bundle will be copied to |paths.output|.
+    """
+    for dist in config.distributions:
+        with commands.WorkDirectory(orig_paths) as paths:
+            dist_config = dist.to_config(config)
+
+            # Copy the app to sign into the work dir.
+            commands.copy_files(
+                os.path.join(paths.input, config.app_dir), paths.work)
+
+            # Customize the app bundle.
+            modification.customize_distribution(paths, dist, dist_config)
+
+            signing.sign_chrome(paths, dist_config)
+
+            # If not packaging into a DMG, simply copy the signed bundle to the
+            # output directory.
+            if not package_dmg:
+                dest_dir = os.path.join(paths.output, dist_config.dmg_basename)
+                commands.make_dir(dest_dir)
+                commands.copy_files(
+                    os.path.join(paths.work, dist_config.app_dir), dest_dir)
+                continue
+
+            dmg_path = _package_dmg(paths, dist, dist_config)
+
+            # dmg_identifier is like dmg_name but without the .dmg suffix. If a
+            # brand code is in use, use the actual brand code instead of the
+            # name fragment, to avoid leaking the association between brand
+            # codes and their meanings.
+            dmg_identifier = dist_config.dmg_basename
+            if dist.branding_code:
+                dmg_identifier = dist_config.dmg_basename.replace(
+                    dist.dmg_name_fragment, dist.branding_code)
+
+            product = model.CodeSignedProduct(
+                dmg_path, dmg_identifier, sign_with_identifier=True)
+            signing.sign_part(paths, dist_config, product)
+            signing.verify_part(paths, product)
+
+    _package_installer_tools(orig_paths, config)
diff --git a/chrome/installer/mac/signing/pipeline_test.py b/chrome/installer/mac/signing/pipeline_test.py
new file mode 100644
index 0000000..0693c6da
--- /dev/null
+++ b/chrome/installer/mac/signing/pipeline_test.py
@@ -0,0 +1,312 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os.path
+import unittest
+
+from . import model, pipeline, test_common, test_config
+
+mock = test_common.import_mock()
+
+
+def _get_work_dir(*args, **kwargs):
+    _get_work_dir.count += 1
+    return '$W_{}'.format(_get_work_dir.count)
+
+
+_get_work_dir.count = 0
+
+
+def _get_adjacent_item(l, o):
+    """Finds object |o| in collection |l| and returns the item at its index
+    plus 1.
+    """
+    index = l.index(o)
+    return l[index + 1]
+
+
+@mock.patch.multiple(
+    'signing.commands', **{
+        m: mock.DEFAULT for m in ('move_file', 'copy_files', 'run_command',
+                                  'make_dir', 'shutil')
+    })
+@mock.patch.multiple(
+    'signing.signing',
+    **{m: mock.DEFAULT for m in ('sign_part', 'sign_chrome', 'verify_part')})
+@mock.patch('signing.commands.tempfile.mkdtemp', _get_work_dir)
+class TestPipeline(unittest.TestCase):
+
+    def setUp(self):
+        _get_work_dir.count = 0
+        self.paths = model.Paths('$I', '$O', None)
+
+    def test_package_dmg_no_customize(self, **kwargs):
+        dist = model.Distribution()
+        config = test_config.TestConfig()
+        paths = self.paths.replace_work('$W')
+
+        dmg_path = pipeline._package_dmg(paths, dist, config)
+        self.assertEqual('$O/AppProduct-99.0.9999.99.dmg', dmg_path)
+
+        pkg_dmg_args = kwargs['run_command'].mock_calls[0][1][0]
+
+        self.assertEqual(dmg_path, _get_adjacent_item(pkg_dmg_args, '--target'))
+        self.assertEqual('$I/Product Packaging/chrome_dmg_icon.icns',
+                         _get_adjacent_item(pkg_dmg_args, '--icon'))
+        self.assertEqual('App Product',
+                         _get_adjacent_item(pkg_dmg_args, '--volname'))
+        self.assertEqual('$W/empty', _get_adjacent_item(pkg_dmg_args,
+                                                        '--source'))
+
+        copy_specs = [
+            pkg_dmg_args[i + 1]
+            for i, arg in enumerate(pkg_dmg_args)
+            if arg == '--copy'
+        ]
+        self.assertEqual(
+            set(copy_specs),
+            set([
+                '$W/App Product.app:/',
+                '$I/Product Packaging/keystone_install.sh:/.keystone_install',
+                '$I/Product Packaging/chrome_dmg_background.png:/.background/background.png',
+                '$I/Product Packaging/chrome_dmg_dsstore:/.DS_Store'
+            ]))
+
+    def test_package_dmg_customize(self, **kwargs):
+        dist = model.Distribution(
+            channel_customize=True,
+            channel='canary',
+            app_name_fragment='Canary')
+        config = dist.to_config(test_config.TestConfig())
+        paths = self.paths.replace_work('$W')
+
+        dmg_path = pipeline._package_dmg(paths, dist, config)
+        self.assertEqual('$O/AppProductCanary-99.0.9999.99.dmg', dmg_path)
+
+        pkg_dmg_args = kwargs['run_command'].mock_calls[0][1][0]
+
+        self.assertEqual(dmg_path, _get_adjacent_item(pkg_dmg_args, '--target'))
+        self.assertEqual('$I/Product Packaging/chrome_canary_dmg_icon.icns',
+                         _get_adjacent_item(pkg_dmg_args, '--icon'))
+        self.assertEqual('App Product Canary',
+                         _get_adjacent_item(pkg_dmg_args, '--volname'))
+        self.assertEqual('$W/empty', _get_adjacent_item(pkg_dmg_args,
+                                                        '--source'))
+
+        copy_specs = [
+            pkg_dmg_args[i + 1]
+            for i, arg in enumerate(pkg_dmg_args)
+            if arg == '--copy'
+        ]
+        self.assertEqual(
+            set(copy_specs),
+            set([
+                '$W/App Product Canary.app:/',
+                '$I/Product Packaging/keystone_install.sh:/.keystone_install',
+                '$I/Product Packaging/chrome_dmg_background.png:/.background/background.png',
+                '$I/Product Packaging/chrome_canary_dmg_dsstore:/.DS_Store'
+            ]))
+
+    def test_package_installer_tools(self, **kwargs):
+        manager = mock.Mock()
+        for attr in kwargs:
+            manager.attach_mock(kwargs[attr], attr)
+
+        config = test_config.TestConfig()
+        pipeline._package_installer_tools(self.paths, config)
+
+        # Start and end with the work dir.
+        self.assertEqual(
+            mock.call.make_dir('$W_1/diff_tools'), manager.mock_calls[0])
+        self.assertEqual(
+            mock.call.shutil.rmtree('$W_1'), manager.mock_calls[-1])
+
+        self.assertEqual(
+            mock.call.run_command(
+                ['zip', '-9ry', '$O/diff_tools.zip', 'diff_tools'], cwd='$W_1'),
+            manager.mock_calls[-2])
+
+        files_to_copy = set([
+            'goobspatch',
+            'liblzma_decompress.dylib',
+            'goobsdiff',
+            'xz',
+            'xzdec',
+            'dirdiffer.sh',
+            'dirpatcher.sh',
+            'dmgdiffer.sh',
+            'keystone_install.sh',
+            'pkg-dmg',
+        ])
+        copied_files = []
+        for call in manager.mock_calls:
+            if call[0] == 'copy_files':
+                args = call[1]
+                self.assertTrue(args[0].startswith('$I/Product Packaging/'))
+                self.assertEqual('$W_1/diff_tools', args[1])
+                copied_files.append(os.path.basename(args[0]))
+
+        self.assertEqual(len(copied_files), len(files_to_copy))
+        self.assertEqual(set(copied_files), files_to_copy)
+
+        files_to_sign = set([
+            'goobspatch',
+            'liblzma_decompress.dylib',
+            'goobsdiff',
+            'xz',
+            'xzdec',
+        ])
+        signed_files = []
+        verified_files = []
+
+        for call in manager.mock_calls:
+            args = call[1]
+            if call[0] == 'sign_part':
+                signed_files.append(os.path.basename(args[2].path))
+            elif call[0] == 'verify_part':
+                path = os.path.basename(args[1].path)
+                self.assertTrue(path in signed_files)
+                verified_files.append(path)
+
+        self.assertEqual(len(signed_files), len(files_to_sign))
+        self.assertEqual(len(verified_files), len(files_to_sign))
+        self.assertEqual(set(signed_files), files_to_sign)
+        self.assertEqual(set(verified_files), files_to_sign)
+
+    @mock.patch('signing.pipeline._package_installer_tools')
+    @mock.patch('signing.modification.customize_distribution')
+    def test_sign_basic_distribution(self, customize, package_installer,
+                                     **kwargs):
+        manager = mock.Mock()
+        for attr in kwargs:
+            manager.attach_mock(kwargs[attr], attr)
+        manager.attach_mock(customize, 'customize_distribution')
+        manager.attach_mock(package_installer, 'package_installer_tools')
+
+        config = test_config.TestConfig()
+        pipeline.sign_all(self.paths, config)
+
+        package_installer.assert_called_once()
+
+        manager.assert_has_calls([
+            # Then the customization and distribution.
+            mock.call.copy_files('$I/App Product.app', '$W_1'),
+            mock.call.customize_distribution(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.sign_chrome(mock.ANY, mock.ANY),
+            mock.call.make_dir('$W_1/empty'),
+            mock.call.run_command(mock.ANY),
+            mock.call.sign_part(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.verify_part(mock.ANY, mock.ANY),
+            mock.call.shutil.rmtree('$W_1'),
+
+            # Finally the installer tools.
+            mock.call.package_installer_tools(mock.ANY, mock.ANY),
+        ])
+
+        run_command = [
+            call for call in manager.mock_calls if call[0] == 'run_command'
+        ][0]
+        pkg_dmg_args = run_command[1][0]
+
+        self.assertEqual('$O/AppProduct-99.0.9999.99.dmg',
+                         _get_adjacent_item(pkg_dmg_args, '--target'))
+        self.assertEqual(config.app_product,
+                         _get_adjacent_item(pkg_dmg_args, '--volname'))
+        self.assertEqual('AppProduct-99.0.9999.99',
+                         kwargs['sign_part'].mock_calls[0][1][2].identifier)
+
+    @mock.patch('signing.pipeline._package_installer_tools')
+    @mock.patch('signing.modification.customize_distribution')
+    def test_sign_no_dmg(self, customize, package_installer, **kwargs):
+        manager = mock.Mock()
+        for attr in kwargs:
+            manager.attach_mock(kwargs[attr], attr)
+        manager.attach_mock(customize, 'customize_distribution')
+        manager.attach_mock(package_installer, 'package_installer_tools')
+
+        config = test_config.TestConfig()
+        pipeline.sign_all(self.paths, config, package_dmg=False)
+
+        package_installer.assert_called_once()
+
+        manager.assert_has_calls([
+            # Then the customization and distribution.
+            mock.call.copy_files('$I/App Product.app', '$W_1'),
+            mock.call.customize_distribution(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.sign_chrome(mock.ANY, mock.ANY),
+            mock.call.make_dir('$O/AppProduct-99.0.9999.99'),
+            mock.call.copy_files('$W_1/App Product.app',
+                                 '$O/AppProduct-99.0.9999.99'),
+            mock.call.shutil.rmtree('$W_1'),
+
+            # Finally the installer tools.
+            mock.call.package_installer_tools(mock.ANY, mock.ANY),
+        ])
+
+        self.assertEqual(0, kwargs['run_command'].call_count)
+
+    @mock.patch('signing.pipeline._package_installer_tools')
+    @mock.patch('signing.modification.customize_distribution')
+    def test_sign_branded_distribution(self, customize, package_installer,
+                                       **kwargs):
+        manager = mock.Mock()
+        for attr in kwargs:
+            manager.attach_mock(kwargs[attr], attr)
+        manager.attach_mock(customize, 'customize_distribution')
+        manager.attach_mock(package_installer, 'package_installer_tools')
+
+        class Config(test_config.TestConfig):
+
+            @property
+            def distributions(self):
+                return [
+                    model.Distribution(),
+                    model.Distribution(
+                        branding_code='MOO', dmg_name_fragment='ForCows'),
+                ]
+
+        config = Config()
+        pipeline.sign_all(self.paths, config)
+
+        package_installer.assert_called_once()
+        self.assertEqual(2, customize.call_count)
+
+        manager.assert_has_calls([
+            # First distribution.
+            mock.call.copy_files('$I/App Product.app', '$W_1'),
+            mock.call.customize_distribution(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.sign_chrome(mock.ANY, mock.ANY),
+            mock.call.make_dir('$W_1/empty'),
+            mock.call.run_command(mock.ANY),
+            mock.call.sign_part(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.verify_part(mock.ANY, mock.ANY),
+            mock.call.shutil.rmtree('$W_1'),
+
+            # Customized distribution.
+            mock.call.copy_files('$I/App Product.app', '$W_2'),
+            mock.call.customize_distribution(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.sign_chrome(mock.ANY, mock.ANY),
+            mock.call.make_dir('$W_2/empty'),
+            mock.call.run_command(mock.ANY),
+            mock.call.sign_part(mock.ANY, mock.ANY, mock.ANY),
+            mock.call.verify_part(mock.ANY, mock.ANY),
+            mock.call.shutil.rmtree('$W_2'),
+
+            # Finally the installer tools.
+            mock.call.package_installer_tools(mock.ANY, mock.ANY),
+        ])
+
+        run_commands = [
+            call for call in manager.mock_calls if call[0] == 'run_command'
+        ]
+
+        target = _get_adjacent_item(run_commands[0][1][0], '--target')
+        self.assertEqual('$O/AppProduct-99.0.9999.99.dmg', target)
+        self.assertEqual('AppProduct-99.0.9999.99',
+                         kwargs['sign_part'].mock_calls[0][1][2].identifier)
+
+        target = _get_adjacent_item(run_commands[1][1][0], '--target')
+        self.assertEqual('$O/AppProduct-99.0.9999.99-ForCows.dmg', target)
+        self.assertEqual('AppProduct-99.0.9999.99-MOO',
+                         kwargs['sign_part'].mock_calls[1][1][2].identifier)
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index ad86bb0..91b4fba 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -42,6 +42,7 @@
 #include "content/public/common/service_manager_connection.h"
 #include "content/public/common/service_names.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
@@ -366,34 +367,33 @@
   service_manager_ = std::make_unique<service_manager::ServiceManager>(
       std::make_unique<NullServiceProcessLauncherFactory>(), manifests);
 
-  service_manager::mojom::ServicePtr browser_proxy;
+  service_manager::mojom::ServicePtrInfo browser_proxy;
   service_manager_connection_ = content::ServiceManagerConnection::Create(
       mojo::MakeRequest(&browser_proxy),
       base::SequencedTaskRunnerHandle::Get());
   service_manager_connection_->AddConnectionFilter(
       std::make_unique<ConnectionFilterImpl>());
 
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
+  mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
   service_manager_->RegisterService(
       service_manager::Identity(content::mojom::kBrowserServiceName,
                                 service_manager::kSystemInstanceGroup,
                                 base::Token{}, base::Token::CreateRandom()),
-      std::move(browser_proxy), mojo::MakeRequest(&pid_receiver));
-  pid_receiver->SetPID(base::GetCurrentProcId());
-  pid_receiver.reset();
+      std::move(browser_proxy), metadata.BindNewPipeAndPassReceiver());
+  metadata->SetPID(base::GetCurrentProcId());
+  metadata.reset();
 
   std::string mojo_bootstrap_token = base::NumberToString(base::RandUint64());
-  service_manager::mojom::ServicePtr utility_service;
-  utility_service.Bind(service_manager::mojom::ServicePtrInfo(
-      mojo_invitation_.AttachMessagePipe(mojo_bootstrap_token), 0u));
+  service_manager::mojom::ServicePtrInfo utility_service(
+      mojo_invitation_.AttachMessagePipe(mojo_bootstrap_token), 0u);
   utility_service_instance_identity_ =
       service_manager::Identity(content::mojom::kUtilityServiceName,
                                 service_manager::kSystemInstanceGroup,
                                 base::Token{}, base::Token::CreateRandom());
   service_manager_->RegisterService(utility_service_instance_identity_,
                                     std::move(utility_service),
-                                    mojo::MakeRequest(&pid_receiver));
-  pid_receiver->SetPID(base::GetCurrentProcId());
+                                    metadata.BindNewPipeAndPassReceiver());
+  metadata->SetPID(base::GetCurrentProcId());
 
   service_manager_connection_->Start();
 
diff --git a/chrome/services/cups_ipp_parser/BUILD.gn b/chrome/services/cups_ipp_parser/BUILD.gn
index 88a16bc5..bccae5f1e 100644
--- a/chrome/services/cups_ipp_parser/BUILD.gn
+++ b/chrome/services/cups_ipp_parser/BUILD.gn
@@ -16,6 +16,7 @@
 
   deps = [
     "//base",
+    "//chrome/services/cups_proxy/public/cpp",
     "//mojo/public/cpp/bindings",
     "//net",
   ]
diff --git a/chrome/services/cups_ipp_parser/DEPS b/chrome/services/cups_ipp_parser/DEPS
new file mode 100644
index 0000000..831ddb4
--- /dev/null
+++ b/chrome/services/cups_ipp_parser/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/services/cups_proxy/public/cpp"
+]
diff --git a/chrome/services/cups_ipp_parser/ipp_parser.cc b/chrome/services/cups_ipp_parser/ipp_parser.cc
index fbb1539..88ed77b 100644
--- a/chrome/services/cups_ipp_parser/ipp_parser.cc
+++ b/chrome/services/cups_ipp_parser/ipp_parser.cc
@@ -6,10 +6,13 @@
 
 #include <cups/cups.h>
 #include <memory>
+#include <string>
 #include <utility>
+#include <vector>
 
 #include "base/optional.h"
 #include "chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h"
+#include "chrome/services/cups_proxy/public/cpp/type_conversions.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/http/http_util.h"
 
diff --git a/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.cpp b/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.cpp
index c9927bf..7383914 100644
--- a/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.cpp
+++ b/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.cpp
@@ -2,7 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ipp_converter.h"
+#include "chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h"
+
+#include <algorithm>
+#include <string>
+#include <utility>
+#include <vector>
 
 #include "base/strings/strcat.h"
 #include "base/strings/string_split.h"
@@ -360,27 +365,4 @@
   return ret;
 }
 
-// Implicit conversion is safe since the conversion preserves memory layout.
-std::vector<uint8_t> ConvertToByteBuffer(base::StringPiece char_buffer) {
-  std::vector<uint8_t> byte_buffer;
-  byte_buffer.resize(char_buffer.size());
-
-  std::copy(char_buffer.begin(), char_buffer.end(), byte_buffer.begin());
-  return byte_buffer;
-}
-
-// Implicit conversion is safe since the conversion preserves memory layout.
-std::vector<char> ConvertToCharBuffer(base::span<const uint8_t> byte_buffer) {
-  std::vector<char> char_buffer;
-  char_buffer.resize(byte_buffer.size());
-
-  std::copy(byte_buffer.begin(), byte_buffer.end(), char_buffer.begin());
-  return char_buffer;
-}
-
-std::string ConvertToString(base::span<const uint8_t> byte_buffer) {
-  std::vector<char> char_buffer = ConvertToCharBuffer(byte_buffer);
-  return std::string(char_buffer.begin(), char_buffer.end());
-}
-
 }  // namespace ipp_converter
diff --git a/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h b/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h
index 9637305f..f534f807 100644
--- a/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h
+++ b/chrome/services/cups_ipp_parser/public/cpp/ipp_converter.h
@@ -88,11 +88,6 @@
 // Note: This function does not take ownership of |ipp|.
 chrome::mojom::IppMessagePtr ConvertIppToMojo(ipp_t* ipp);
 
-// Common converters for working with arbitrary byte buffers.
-std::vector<uint8_t> ConvertToByteBuffer(base::StringPiece char_buffer);
-std::vector<char> ConvertToCharBuffer(base::span<const uint8_t> byte_buffer);
-std::string ConvertToString(base::span<const uint8_t> byte_buffer);
-
 }  // namespace ipp_converter
 
 #endif  // CHROME_SERVICES_CUPS_IPP_PARSER_PUBLIC_CPP_IPP_CONVERTER_H_
diff --git a/chrome/services/cups_proxy/public/cpp/BUILD.gn b/chrome/services/cups_proxy/public/cpp/BUILD.gn
index f507c8e9cc..93c5350 100644
--- a/chrome/services/cups_proxy/public/cpp/BUILD.gn
+++ b/chrome/services/cups_proxy/public/cpp/BUILD.gn
@@ -7,6 +7,17 @@
 
 assert(is_chromeos, "Non-Chrome-OS builds must not depend on this")
 
+source_set("cpp") {
+  sources = [
+    "type_conversions.cpp",
+    "type_conversions.h",
+  ]
+
+  deps = [
+    "//base",
+  ]
+}
+
 source_set("manifest") {
   sources = [
     "manifest.cc",
diff --git a/chrome/services/cups_proxy/public/cpp/type_conversions.cpp b/chrome/services/cups_proxy/public/cpp/type_conversions.cpp
new file mode 100644
index 0000000..15c3be5
--- /dev/null
+++ b/chrome/services/cups_proxy/public/cpp/type_conversions.cpp
@@ -0,0 +1,39 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/services/cups_proxy/public/cpp/type_conversions.h"
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "base/containers/span.h"
+#include "base/strings/string_piece.h"
+
+namespace ipp_converter {
+
+// Implicit conversion is safe since the conversion preserves memory layout.
+std::vector<uint8_t> ConvertToByteBuffer(base::StringPiece char_buffer) {
+  std::vector<uint8_t> byte_buffer;
+  byte_buffer.resize(char_buffer.size());
+
+  std::copy(char_buffer.begin(), char_buffer.end(), byte_buffer.begin());
+  return byte_buffer;
+}
+
+// Implicit conversion is safe since the conversion preserves memory layout.
+std::vector<char> ConvertToCharBuffer(base::span<const uint8_t> byte_buffer) {
+  std::vector<char> char_buffer;
+  char_buffer.resize(byte_buffer.size());
+
+  std::copy(byte_buffer.begin(), byte_buffer.end(), char_buffer.begin());
+  return char_buffer;
+}
+
+std::string ConvertToString(base::span<const uint8_t> byte_buffer) {
+  std::vector<char> char_buffer = ConvertToCharBuffer(byte_buffer);
+  return std::string(char_buffer.begin(), char_buffer.end());
+}
+
+}  // namespace ipp_converter
diff --git a/chrome/services/cups_proxy/public/cpp/type_conversions.h b/chrome/services/cups_proxy/public/cpp/type_conversions.h
new file mode 100644
index 0000000..0ce6cc2
--- /dev/null
+++ b/chrome/services/cups_proxy/public/cpp/type_conversions.h
@@ -0,0 +1,23 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_SERVICES_CUPS_PROXY_PUBLIC_CPP_TYPE_CONVERSIONS_H_
+#define CHROME_SERVICES_CUPS_PROXY_PUBLIC_CPP_TYPE_CONVERSIONS_H_
+
+#include <string>
+#include <vector>
+
+#include "base/containers/span.h"
+#include "base/strings/string_piece.h"
+
+namespace ipp_converter {
+
+// Common converters for working with arbitrary byte buffers.
+std::vector<uint8_t> ConvertToByteBuffer(base::StringPiece char_buffer);
+std::vector<char> ConvertToCharBuffer(base::span<const uint8_t> byte_buffer);
+std::string ConvertToString(base::span<const uint8_t> byte_buffer);
+
+}  // namespace ipp_converter
+
+#endif  // CHROME_SERVICES_CUPS_PROXY_PUBLIC_CPP_TYPE_CONVERSIONS_H_
diff --git a/chrome/test/data/local_ntp/local_ntp_browsertest.html b/chrome/test/data/local_ntp/local_ntp_browsertest.html
index 19fe59d0..be92322 100644
--- a/chrome/test/data/local_ntp/local_ntp_browsertest.html
+++ b/chrome/test/data/local_ntp/local_ntp_browsertest.html
@@ -148,11 +148,6 @@
       </div>
       <div id="bg-sel-tiles" tabindex="0"></div>
       <div id="bg-sel-footer">
-        <label id="bg-daily-refresh" class="switch">
-          <input type="checkbox">
-          <span class="toggle"></span>
-        </label>
-        <div id="bg-sel-refresh-text"></div>
         <button id="bg-sel-footer-cancel" class="bg-sel-footer-button paper secondary ripple"
             tabindex="0"></button>
         <button id="bg-sel-footer-done" class="bg-sel-footer-button paper primary ripple"
diff --git a/chrome/test/data/webui/downloads/manager_tests.js b/chrome/test/data/webui/downloads/manager_tests.js
index 329d5a33e..ddf31ea8 100644
--- a/chrome/test/data/webui/downloads/manager_tests.js
+++ b/chrome/test/data/webui/downloads/manager_tests.js
@@ -24,23 +24,22 @@
     assertEquals(manager, downloads.Manager.get());
   });
 
-  test('long URLs elide', function() {
+  test('long URLs elide', async () => {
     pageRouterProxy.insertItems(0, [createDownload({
                                   fileName: 'file name',
                                   state: downloads.States.COMPLETE,
                                   sinceString: 'Today',
                                   url: 'a'.repeat(1000),
                                 })]);
-    return pageRouterProxy.$.flushForTesting().then(() => {
-      Polymer.dom.flush();
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
 
-      const item = manager.$$('downloads-item');
-      assertLT(item.$$('#url').offsetWidth, item.offsetWidth);
-      assertEquals(300, item.$$('#url').textContent.length);
-    });
+    const item = manager.$$('downloads-item');
+    assertLT(item.$$('#url').offsetWidth, item.offsetWidth);
+    assertEquals(300, item.$$('#url').textContent.length);
   });
 
-  test('inserting items at beginning render dates correctly', function() {
+  test('inserting items at beginning render dates correctly', async () => {
     const countDates = () => {
       const items = manager.shadowRoot.querySelectorAll('downloads-item');
       return Array.from(items).reduce((soFar, item) => {
@@ -48,75 +47,87 @@
       }, 0);
     };
 
-    let download1 = createDownload();
-    let download2 = createDownload();
+    const download1 = createDownload();
+    const download2 = createDownload();
 
     pageRouterProxy.insertItems(0, [download1, download2]);
-    return pageRouterProxy.$.flushForTesting()
-        .then(() => {
-          Polymer.dom.flush();
-          assertEquals(1, countDates());
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    assertEquals(1, countDates());
 
-          pageRouterProxy.removeItem(0);
-          return pageRouterProxy.$.flushForTesting();
-        })
-        .then(() => {
-          Polymer.dom.flush();
-          assertEquals(1, countDates());
+    pageRouterProxy.removeItem(0);
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    assertEquals(1, countDates());
 
-          pageRouterProxy.insertItems(0, [download1]);
-          return pageRouterProxy.$.flushForTesting();
-        })
-        .then(() => {
-          Polymer.dom.flush();
-          assertEquals(1, countDates());
-        });
+    pageRouterProxy.insertItems(0, [download1]);
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    assertEquals(1, countDates());
   });
 
-  test('update', function() {
-    let dangerousDownload = createDownload({
+  test('update', async () => {
+    const dangerousDownload = createDownload({
       dangerType: downloads.DangerType.DANGEROUS_FILE,
       state: downloads.States.DANGEROUS,
     });
     pageRouterProxy.insertItems(0, [dangerousDownload]);
-    return pageRouterProxy.$.flushForTesting()
-        .then(() => {
-          Polymer.dom.flush();
-          assertTrue(!!manager.$$('downloads-item').$$('.dangerous'));
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    assertTrue(!!manager.$$('downloads-item').$$('.dangerous'));
 
-          let safeDownload = Object.assign({}, dangerousDownload, {
-            dangerType: downloads.DangerType.NOT_DANGEROUS,
-            state: downloads.States.COMPLETE,
-          });
-          pageRouterProxy.updateItem(0, safeDownload);
-          return pageRouterProxy.$.flushForTesting();
-        })
-        .then(() => {
-          Polymer.dom.flush();
-          assertFalse(!!manager.$$('downloads-item').$$('.dangerous'));
-        });
+    const safeDownload = Object.assign({}, dangerousDownload, {
+      dangerType: downloads.DangerType.NOT_DANGEROUS,
+      state: downloads.States.COMPLETE,
+    });
+    pageRouterProxy.updateItem(0, safeDownload);
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    assertFalse(!!manager.$$('downloads-item').$$('.dangerous'));
   });
 
-  test('remove', () => {
+  test('remove', async () => {
     pageRouterProxy.insertItems(0, [createDownload({
                                   fileName: 'file name',
                                   state: downloads.States.COMPLETE,
                                   sinceString: 'Today',
                                   url: 'a'.repeat(1000),
                                 })]);
-    return pageRouterProxy.$.flushForTesting()
-        .then(() => {
-          Polymer.dom.flush();
-          const item = manager.$$('downloads-item');
+    await pageRouterProxy.$.flushForTesting();
+    Polymer.dom.flush();
+    const item = manager.$$('downloads-item');
 
-          item.$.remove.click();
-          return testBrowserProxy.handler.whenCalled('remove');
-        })
-        .then(() => {
-          Polymer.dom.flush();
-          const list = manager.$$('iron-list');
-          assertTrue(list.hidden);
-        });
+    item.$.remove.click();
+    await testBrowserProxy.handler.whenCalled('remove');
+    Polymer.dom.flush();
+    const list = manager.$$('iron-list');
+    assertTrue(list.hidden);
+  });
+
+  test('toolbar hasClearableDownloads set correctly', async () => {
+    const clearable = createDownload();
+    pageRouterProxy.insertItems(0, [clearable]);
+    const checkNotClearable = async state => {
+      const download = createDownload({state: state});
+      pageRouterProxy.updateItem(0, clearable);
+      await pageRouterProxy.$.flushForTesting();
+      assertTrue(manager.$.toolbar.hasClearableDownloads);
+      pageRouterProxy.updateItem(0, download);
+      await pageRouterProxy.$.flushForTesting();
+      assertFalse(manager.$.toolbar.hasClearableDownloads);
+    };
+    await checkNotClearable(downloads.States.DANGEROUS);
+    await checkNotClearable(downloads.States.IN_PROGRESS);
+    await checkNotClearable(downloads.States.PAUSED);
+
+    pageRouterProxy.updateItem(0, clearable);
+    pageRouterProxy.insertItems(
+        1, [createDownload({state: downloads.States.DANGEROUS})]);
+    await pageRouterProxy.$.flushForTesting();
+    assertTrue(manager.$.toolbar.hasClearableDownloads);
+    pageRouterProxy.removeItem(0);
+    await pageRouterProxy.$.flushForTesting();
+    assertFalse(manager.$.toolbar.hasClearableDownloads);
   });
 
   test('loadTimeData contains isManaged and managedByOrg', function() {
diff --git a/chrome/test/data/webui/downloads/toolbar_tests.js b/chrome/test/data/webui/downloads/toolbar_tests.js
index 31b10d98..b48757e3 100644
--- a/chrome/test/data/webui/downloads/toolbar_tests.js
+++ b/chrome/test/data/webui/downloads/toolbar_tests.js
@@ -35,4 +35,13 @@
     toolbar.$.toolbar.fire('search-changed', 'a ');  // Same term plus a space.
     assertFalse(toolbar.spinnerActive);
   });
+
+  test('clear all shown/hidden', () => {
+    const clearAll = toolbar.$$('#moreActionsMenu button');
+    assertTrue(clearAll.hidden);
+    toolbar.hasClearableDownloads = true;
+    assertFalse(clearAll.hidden);
+    toolbar.$.toolbar.getSearchField().setValue('test');
+    assertTrue(clearAll.hidden);
+  });
 });
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 3fddbc6..2f65eed 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -560,7 +560,8 @@
   ]),
 };
 
-TEST_F('CrSettingsPeoplePageKerberosAccountsTest', 'All', function() {
+// Test is consistently failing. http://crbug.com/960837
+TEST_F('CrSettingsPeoplePageKerberosAccountsTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
@@ -2522,7 +2523,8 @@
   ]),
 };
 
-TEST_F('CrSettingsAddUsersTest', 'All', function() {
+// Test is consistently failing. http://crbug.com/960837
+TEST_F('CrSettingsAddUsersTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
diff --git a/chrome/test/data/webui/settings/languages_page_tests.js b/chrome/test/data/webui/settings/languages_page_tests.js
index 49029ce..9249f12 100644
--- a/chrome/test/data/webui/settings/languages_page_tests.js
+++ b/chrome/test/data/webui/settings/languages_page_tests.js
@@ -622,7 +622,7 @@
             spellCheckLanguagesCount);
       });
 
-      test('only 1 supported language does not show list', () => {
+      test('only 1 supported language', () => {
         if (cr.isMac) {
           return;
         }
@@ -630,13 +630,28 @@
         const list = languagesPage.$.spellCheckLanguagesList;
         assertFalse(list.hidden);
 
-        // Update supported languages to just 1
         languageHelper.setPrefValue('intl.accept_languages', 'en-US');
         if (cr.isChromeOS) {
           languageHelper.setPrefValue(
               'settings.language.preferred_languages', 'en-US');
         }
+
+        // Update supported languages to just 1 language English with spell
+        // check disabled for that language
+        languageHelper.setPrefValue('spellcheck.dictionaries', []);
         assertTrue(list.hidden);
+        assertFalse(
+            languageHelper.getPref('browser.enable_spellchecking').value);
+
+        // Update supported languages to just 1 language English that finished
+        // downloading and is now ready
+        languageHelper.setPrefValue('spellcheck.dictionaries', ['en-US']);
+        languageHelper.set('languages.enabled.0.downloadDictionaryStatus', {
+          isReady: true,
+        });
+        assertTrue(list.hidden);
+        assertTrue(
+            languageHelper.getPref('browser.enable_spellchecking').value);
       });
 
       test('no supported languages', () => {
diff --git a/chromecast/external_mojo/public/cpp/external_mojo_broker.cc b/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
index 6f7d8f98..9fd07fb 100644
--- a/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
+++ b/chromecast/external_mojo/public/cpp/external_mojo_broker.cc
@@ -19,6 +19,7 @@
 #include "chromecast/external_mojo/public/cpp/common.h"
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
@@ -144,7 +145,8 @@
     void RegisterServiceInstance(
         const ::service_manager::Identity& identity,
         mojo::ScopedMessagePipeHandle service,
-        service_manager::mojom::PIDReceiverRequest pid_receiver_request,
+        mojo::PendingReceiver<service_manager::mojom::ProcessMetadata>
+            metadata_receiver,
         RegisterServiceInstanceCallback callback) override {
       // TODO(kmackay) Could add a wrapper as needed.
       NOTIMPLEMENTED();
@@ -185,17 +187,16 @@
 
     for (const auto& service_name : external_services_to_proxy) {
       LOG(INFO) << "Register proxy for external " << service_name;
-      service_manager::mojom::ServicePtr service_ptr;
+      service_manager::mojom::ServicePtrInfo service_ptr;
       registered_external_services_[service_name] =
           std::make_unique<ExternalServiceProxy>(
               this, service_name, mojo::MakeRequest(&service_ptr));
 
-      service_manager::mojom::PIDReceiverPtr pid_receiver;
       connector_->RegisterServiceInstance(
           service_manager::Identity(service_name,
                                     service_manager::kSystemInstanceGroup,
                                     base::Token{}, base::Token::CreateRandom()),
-          std::move(service_ptr), mojo::MakeRequest(&pid_receiver),
+          std::move(service_ptr), mojo::NullReceiver() /* metadata_receiver */,
           base::BindOnce(&OnRegisterServiceResult, service_name));
     }
   }
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index 69d09b2ff..bdc11c5d 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "ash/public/cpp/session/session_controller.h"
 #include "ash/public/interfaces/constants.mojom.h"
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -64,7 +65,6 @@
                      url_loader_factory_info)
     : service_binding_(this, std::move(request)),
       platform_binding_(this),
-      session_observer_binding_(this),
       token_refresh_timer_(std::make_unique<base::OneShotTimer>()),
       main_task_runner_(base::SequencedTaskRunnerHandle::Get()),
       power_manager_observer_(this),
@@ -82,7 +82,13 @@
   power_manager_client->RequestStatusUpdate();
 }
 
-Service::~Service() = default;
+Service::~Service() {
+  auto* const session_controller = ash::SessionController::Get();
+  if (observing_ash_session_ && session_controller) {
+    session_controller->RemoveSessionActivationObserverForAccountId(account_id_,
+                                                                    this);
+  }
+}
 
 void Service::RequestAccessToken() {
   // Bypass access token fetching under signed out mode.
@@ -362,7 +368,7 @@
          AssistantManagerService::State::RUNNING);
 
   // Using session_observer_binding_ as a flag to control onetime initialization
-  if (!session_observer_binding_) {
+  if (!observing_ash_session_) {
     // Bind to the AssistantController in ash.
     service_binding_.GetConnector()->BindInterface(ash::mojom::kServiceName,
                                                    &assistant_controller_);
@@ -406,13 +412,9 @@
 }
 
 void Service::AddAshSessionObserver() {
-  ash::mojom::SessionControllerPtr session_controller;
-  service_binding_.GetConnector()->BindInterface(ash::mojom::kServiceName,
-                                                 &session_controller);
-  ash::mojom::SessionActivationObserverPtr observer;
-  session_observer_binding_.Bind(mojo::MakeRequest(&observer));
-  session_controller->AddSessionActivationObserverForAccountId(
-      account_id_, std::move(observer));
+  observing_ash_session_ = true;
+  ash::SessionController::Get()->AddSessionActivationObserverForAccountId(
+      account_id_, this);
 }
 
 void Service::UpdateListeningState() {
diff --git a/chromeos/services/assistant/service.h b/chromeos/services/assistant/service.h
index b51cf64..a77f67ed 100644
--- a/chromeos/services/assistant/service.h
+++ b/chromeos/services/assistant/service.h
@@ -10,8 +10,8 @@
 
 #include "ash/public/cpp/assistant/assistant_state_proxy.h"
 #include "ash/public/cpp/assistant/default_voice_interaction_observer.h"
+#include "ash/public/cpp/session/session_activation_observer.h"
 #include "ash/public/interfaces/assistant_controller.mojom.h"
-#include "ash/public/interfaces/session_controller.mojom.h"
 #include "ash/public/interfaces/voice_interaction_controller.mojom.h"
 #include "base/callback.h"
 #include "base/component_export.h"
@@ -56,7 +56,7 @@
 class COMPONENT_EXPORT(ASSISTANT_SERVICE) Service
     : public service_manager::Service,
       public chromeos::PowerManagerClient::Observer,
-      public ash::mojom::SessionActivationObserver,
+      public ash::SessionActivationObserver,
       public mojom::AssistantPlatform,
       public ash::DefaultVoiceInteractionObserver {
  public:
@@ -126,7 +126,7 @@
   void PowerChanged(const power_manager::PowerSupplyProperties& prop) override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
-  // ash::mojom::SessionActivationObserver overrides:
+  // ash::SessionActivationObserver overrides:
   void OnSessionActivated(bool activated) override;
   void OnLockStateChanged(bool locked) override;
 
@@ -171,8 +171,7 @@
 
   mojo::BindingSet<mojom::Assistant> bindings_;
   mojo::Binding<mojom::AssistantPlatform> platform_binding_;
-  mojo::Binding<ash::mojom::SessionActivationObserver>
-      session_observer_binding_;
+  bool observing_ash_session_ = false;
   mojom::ClientPtr client_;
   mojom::DeviceActionsPtr device_actions_;
 
diff --git a/chromeos/services/ime/ime_sandbox_hook.cc b/chromeos/services/ime/ime_sandbox_hook.cc
index 43f0b0a..b80e54a 100644
--- a/chromeos/services/ime/ime_sandbox_hook.cc
+++ b/chromeos/services/ime/ime_sandbox_hook.cc
@@ -112,6 +112,8 @@
                                GetImeFilePermissions(),
                                service_manager::SandboxLinux::PreSandboxHook(),
                                options);
+
+  instance->EngageNamespaceSandboxIfPossible();
   return true;
 }
 
diff --git a/chromeos/services/ime/ime_service_unittest.cc b/chromeos/services/ime/ime_service_unittest.cc
index ac775d0..fc84403 100644
--- a/chromeos/services/ime/ime_service_unittest.cc
+++ b/chromeos/services/ime/ime_service_unittest.cc
@@ -13,7 +13,6 @@
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/cpp/test/test_connector_factory.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h
index 86e0c62..791d341f 100644
--- a/components/password_manager/core/browser/password_manager_client.h
+++ b/components/password_manager/core/browser/password_manager_client.h
@@ -253,8 +253,12 @@
   // happens. This is called by the PasswordReuseDetectionManager when a
   // protected password is typed on the wrong domain. This may trigger a
   // warning dialog if it looks like the page is phishy.
+  // The |username| is the user name of the reused password. The user name
+  // can be an email or a username for a non-GAIA or saved-password reuse. No
+  // validation has been done on it.
   virtual void CheckProtectedPasswordEntry(
       metrics_util::PasswordType reused_password_type,
+      const std::string& username,
       const std::vector<std::string>& matching_domains,
       bool password_field_exists) = 0;
 
diff --git a/components/password_manager/core/browser/password_reuse_detection_manager.cc b/components/password_manager/core/browser/password_reuse_detection_manager.cc
index af43d8de..c987e843 100644
--- a/components/password_manager/core/browser/password_reuse_detection_manager.cc
+++ b/components/password_manager/core/browser/password_reuse_detection_manager.cc
@@ -125,8 +125,12 @@
 #if defined(FULL_SAFE_BROWSING)
   if (reused_password_type == metrics_util::PasswordType::SYNC_PASSWORD)
     client_->LogPasswordReuseDetectedEvent();
+  std::string username = reused_protected_password_hash.has_value()
+                             ? reused_protected_password_hash->username
+                             : "";
 
-  client_->CheckProtectedPasswordEntry(reused_password_type, matching_domains,
+  client_->CheckProtectedPasswordEntry(reused_password_type, username,
+                                       matching_domains,
                                        password_field_detected);
 #endif
 }
diff --git a/components/password_manager/core/browser/stub_password_manager_client.cc b/components/password_manager/core/browser/stub_password_manager_client.cc
index 63d4154..1c278108 100644
--- a/components/password_manager/core/browser/stub_password_manager_client.cc
+++ b/components/password_manager/core/browser/stub_password_manager_client.cc
@@ -89,6 +89,7 @@
 
 void StubPasswordManagerClient::CheckProtectedPasswordEntry(
     metrics_util::PasswordType reused_password_type,
+    const std::string& username,
     const std::vector<std::string>& matching_domains,
     bool password_field_exists) {}
 
diff --git a/components/password_manager/core/browser/stub_password_manager_client.h b/components/password_manager/core/browser/stub_password_manager_client.h
index a6822e6..01a31817 100644
--- a/components/password_manager/core/browser/stub_password_manager_client.h
+++ b/components/password_manager/core/browser/stub_password_manager_client.h
@@ -61,6 +61,7 @@
                                    const GURL& frame_url) override;
   void CheckProtectedPasswordEntry(
       metrics_util::PasswordType reused_password_type,
+      const std::string& username,
       const std::vector<std::string>& matching_domains,
       bool password_field_exists) override;
   void LogPasswordReuseDetectedEvent() override;
diff --git a/components/policy/core/common/policy_map_unittest.cc b/components/policy/core/common/policy_map_unittest.cc
index d124eaea..f2f45ed8 100644
--- a/components/policy/core/common/policy_map_unittest.cc
+++ b/components/policy/core/common/policy_map_unittest.cc
@@ -50,7 +50,8 @@
            nullptr, std::move(external_data_fetcher));
 }
 
-std::vector<base::Value> GetListStorage(const std::vector<std::string> entry) {
+template <class T>
+std::vector<base::Value> GetListStorage(const std::vector<T> entry) {
   std::vector<base::Value> result;
   for (const auto& it : entry)
     result.emplace_back(base::Value(it));
@@ -308,11 +309,36 @@
 }
 
 TEST_F(PolicyMapTest, MergeValuesList) {
-  std::vector<base::Value> abcd = GetListStorage({"a", "b", "c", "d"});
-  std::vector<base::Value> abc = GetListStorage({"a", "b", "c"});
-  std::vector<base::Value> ab = GetListStorage({"a", "b"});
-  std::vector<base::Value> cd = GetListStorage({"c", "d"});
-  std::vector<base::Value> ef = GetListStorage({"e", "f"});
+  std::vector<base::Value> abcd =
+      GetListStorage<std::string>({"a", "b", "c", "d"});
+  std::vector<base::Value> abc = GetListStorage<std::string>({"a", "b", "c"});
+  std::vector<base::Value> ab = GetListStorage<std::string>({"a", "b"});
+  std::vector<base::Value> cd = GetListStorage<std::string>({"c", "d"});
+  std::vector<base::Value> ef = GetListStorage<std::string>({"e", "f"});
+
+  std::vector<base::Value> int12 = GetListStorage<int>({1, 2});
+  std::vector<base::Value> int34 = GetListStorage<int>({3, 4});
+  std::vector<base::Value> int56 = GetListStorage<int>({5, 6});
+  std::vector<base::Value> int1234 = GetListStorage<int>({1, 2, 3, 4});
+
+  base::Value dict_ab(base::Value::Type::DICTIONARY);
+  dict_ab.SetBoolKey("a", true);
+  dict_ab.SetBoolKey("b", false);
+  base::Value dict_c(base::Value::Type::DICTIONARY);
+  dict_c.SetBoolKey("c", false);
+  base::Value dict_d(base::Value::Type::DICTIONARY);
+  dict_d.SetBoolKey("d", false);
+
+  std::vector<base::Value> list_dict_abd;
+  list_dict_abd.emplace_back(dict_ab.Clone());
+  list_dict_abd.emplace_back(dict_d.Clone());
+  std::vector<base::Value> list_dict_c;
+  list_dict_c.emplace_back(dict_c.Clone());
+
+  std::vector<base::Value> list_dict_abcd;
+  list_dict_abcd.emplace_back(dict_ab.Clone());
+  list_dict_abcd.emplace_back(dict_d.Clone());
+  list_dict_abcd.emplace_back(dict_c.Clone());
 
   // Case 1 - kTestPolicyName1
   // Enterprise default policies should not be merged with other sources.
@@ -344,19 +370,20 @@
   // level and scope.
   PolicyMap::Entry cloud_machine_recommended(
       POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE,
-      POLICY_SOURCE_PRIORITY_CLOUD, std::make_unique<base::Value>(ab), nullptr);
+      POLICY_SOURCE_PRIORITY_CLOUD, std::make_unique<base::Value>(int12),
+      nullptr);
 
   cloud_machine_recommended.AddConflictingPolicy(PolicyMap::Entry(
       POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM,
-      std::make_unique<base::Value>(cd), nullptr));
+      std::make_unique<base::Value>(int34), nullptr));
 
   cloud_machine_recommended.AddConflictingPolicy(PolicyMap::Entry(
       POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM,
-      std::make_unique<base::Value>(ef), nullptr));
+      std::make_unique<base::Value>(int56), nullptr));
 
   PolicyMap::Entry merged_machine_recommended(
       POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED,
-      std::make_unique<base::Value>(abcd), nullptr);
+      std::make_unique<base::Value>(int1234), nullptr);
   merged_machine_recommended.AddConflictingPolicy(cloud_machine_recommended);
 
   // Case 3 - kTestPolicyName3
@@ -413,6 +440,26 @@
       POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_PRIORITY_CLOUD,
       std::make_unique<base::Value>(ef), nullptr));
 
+  // Case 7 - kTestPolicyName7
+  // Lists of dictionaries should not have duplicates.
+  PolicyMap::Entry platform_user_mandatory_dict(
+      POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM,
+      std::make_unique<base::Value>(list_dict_abd), nullptr);
+
+  platform_user_mandatory_dict.AddConflictingPolicy(PolicyMap::Entry(
+      POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_ACTIVE_DIRECTORY,
+      std::make_unique<base::Value>(list_dict_abd), nullptr));
+
+  platform_user_mandatory_dict.AddConflictingPolicy(
+      PolicyMap::Entry(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+                       POLICY_SOURCE_PUBLIC_SESSION_OVERRIDE,
+                       std::make_unique<base::Value>(list_dict_c), nullptr));
+
+  PolicyMap::Entry merged_user_mandatory_dict(
+      POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED,
+      std::make_unique<base::Value>(list_dict_abcd), nullptr);
+  merged_user_mandatory_dict.AddConflictingPolicy(platform_user_mandatory_dict);
+
   PolicyMap policy_not_merged;
   policy_not_merged.Set(kTestPolicyName1, platform_user_mandatory.DeepCopy());
   policy_not_merged.Set(kTestPolicyName2, cloud_machine_recommended.DeepCopy());
@@ -420,6 +467,8 @@
   policy_not_merged.Set(kTestPolicyName4, ad_machine_mandatory.DeepCopy());
   policy_not_merged.Set(kTestPolicyName5, bad_stuff.DeepCopy());
   policy_not_merged.Set(kTestPolicyName6, user_not_merged.DeepCopy());
+  policy_not_merged.Set(kTestPolicyName7,
+                        platform_user_mandatory_dict.DeepCopy());
 
   PolicyMap expected_list_merged;
   expected_list_merged.Set(kTestPolicyName1, merged_user_mandatory.DeepCopy());
@@ -430,6 +479,8 @@
   expected_list_merged.Set(kTestPolicyName4, ad_machine_mandatory.DeepCopy());
   expected_list_merged.Set(kTestPolicyName5, expected_bad_stuff.DeepCopy());
   expected_list_merged.Set(kTestPolicyName6, user_not_merged.DeepCopy());
+  expected_list_merged.Set(kTestPolicyName7,
+                           merged_user_mandatory_dict.DeepCopy());
 
   PolicyMap list_merged;
   list_merged.CopyFrom(policy_not_merged);
@@ -448,9 +499,9 @@
   EXPECT_TRUE(list_merged.Equals(policy_not_merged));
 
   // Merging lists restrictions specified
-  PolicyListMerger good_policy_list({kTestPolicyName1, kTestPolicyName2,
-                                     kTestPolicyName3, kTestPolicyName4,
-                                     kTestPolicyName5, kTestPolicyName6});
+  PolicyListMerger good_policy_list(
+      {kTestPolicyName1, kTestPolicyName2, kTestPolicyName3, kTestPolicyName4,
+       kTestPolicyName5, kTestPolicyName6, kTestPolicyName7});
   PolicyListMerger wildcard_policy_list({"*"});
   list_merged.MergeValues({&good_policy_list});
   EXPECT_TRUE(list_merged.Equals(expected_list_merged));
@@ -463,10 +514,10 @@
 }
 
 TEST_F(PolicyMapTest, MergeValuesGroup) {
-  std::vector<base::Value> abc = GetListStorage({"a", "b", "c"});
-  std::vector<base::Value> ab = GetListStorage({"a", "b"});
-  std::vector<base::Value> cd = GetListStorage({"c", "d"});
-  std::vector<base::Value> ef = GetListStorage({"e", "f"});
+  std::vector<base::Value> abc = GetListStorage<std::string>({"a", "b", "c"});
+  std::vector<base::Value> ab = GetListStorage<std::string>({"a", "b"});
+  std::vector<base::Value> cd = GetListStorage<std::string>({"c", "d"});
+  std::vector<base::Value> ef = GetListStorage<std::string>({"e", "f"});
 
   // Case 1 - kTestPolicyName1
   // Should not be affected by the atomic groups
diff --git a/components/policy/core/common/policy_merger.cc b/components/policy/core/common/policy_merger.cc
index 940a67a..bf77b030 100644
--- a/components/policy/core/common/policy_merger.cc
+++ b/components/policy/core/common/policy_merger.cc
@@ -49,13 +49,17 @@
 PolicyMap::Entry PolicyListMerger::DoMerge(
     const PolicyMap::Entry& policy) const {
   std::vector<const base::Value*> value;
-  std::set<std::string> duplicates;
+  auto compare_value_ptr = [](const base::Value* a, const base::Value* b) {
+    return *a < *b;
+  };
+  std::set<const base::Value*, decltype(compare_value_ptr)> duplicates(
+      compare_value_ptr);
   bool merged = false;
 
   for (const base::Value& val : policy.value->GetList()) {
-    if (duplicates.find(val.GetString()) != duplicates.end())
+    if (duplicates.find(&val) != duplicates.end())
       continue;
-    duplicates.insert(val.GetString());
+    duplicates.insert(&val);
     value.push_back(&val);
   }
 
@@ -74,9 +78,9 @@
     }
 
     for (const base::Value& val : it.value->GetList()) {
-      if (duplicates.find(val.GetString()) != duplicates.end())
+      if (duplicates.find(&val) != duplicates.end())
         continue;
-      duplicates.insert(val.GetString());
+      duplicates.insert(&val);
       value.push_back(&val);
     }
 
diff --git a/components/safe_browsing/password_protection/mock_password_protection_service.h b/components/safe_browsing/password_protection/mock_password_protection_service.h
index 6391991..03b2a30 100644
--- a/components/safe_browsing/password_protection/mock_password_protection_service.h
+++ b/components/safe_browsing/password_protection/mock_password_protection_service.h
@@ -50,8 +50,11 @@
                void(content::WebContents*,
                     const std::string&,
                     ReusedPasswordType));
-  MOCK_METHOD3(MaybeReportPasswordReuseDetected,
-               void(content::WebContents*, ReusedPasswordType, bool));
+  MOCK_METHOD4(MaybeReportPasswordReuseDetected,
+               void(content::WebContents*,
+                    const std::string&,
+                    ReusedPasswordType,
+                    bool));
   MOCK_METHOD3(UpdateSecurityState,
                void(safe_browsing::SBThreatType,
                     ReusedPasswordType,
@@ -71,9 +74,10 @@
   MOCK_METHOD4(
       MaybeStartPasswordFieldOnFocusRequest,
       void(content::WebContents*, const GURL&, const GURL&, const GURL&));
-  MOCK_METHOD5(MaybeStartProtectedPasswordEntryRequest,
+  MOCK_METHOD6(MaybeStartProtectedPasswordEntryRequest,
                void(content::WebContents*,
                     const GURL&,
+                    const std::string&,
                     ReusedPasswordType,
                     const std::vector<std::string>&,
                     bool));
diff --git a/components/safe_browsing/password_protection/password_protection_request.cc b/components/safe_browsing/password_protection/password_protection_request.cc
index aee6c06..4011c88 100644
--- a/components/safe_browsing/password_protection/password_protection_request.cc
+++ b/components/safe_browsing/password_protection/password_protection_request.cc
@@ -65,6 +65,7 @@
     const GURL& main_frame_url,
     const GURL& password_form_action,
     const GURL& password_form_frame_url,
+    const std::string& username,
     ReusedPasswordType reused_password_type,
     const std::vector<std::string>& matching_domains,
     LoginReputationClientRequest::TriggerType type,
@@ -75,6 +76,7 @@
       main_frame_url_(main_frame_url),
       password_form_action_(password_form_action),
       password_form_frame_url_(password_form_frame_url),
+      username_(username),
       reused_password_type_(reused_password_type),
       matching_domains_(matching_domains),
       trigger_type_(type),
@@ -465,9 +467,8 @@
     }
   }
 
-  password_protection_service_->RequestFinished(
-      this, outcome == RequestOutcome::RESPONSE_ALREADY_CACHED,
-      std::move(response));
+  password_protection_service_->RequestFinished(this, outcome,
+                                                std::move(response));
 }
 
 void PasswordProtectionRequest::Cancel(bool timed_out) {
diff --git a/components/safe_browsing/password_protection/password_protection_request.h b/components/safe_browsing/password_protection/password_protection_request.h
index 886f6dd5..8f25cd0 100644
--- a/components/safe_browsing/password_protection/password_protection_request.h
+++ b/components/safe_browsing/password_protection/password_protection_request.h
@@ -56,6 +56,7 @@
                             const GURL& main_frame_url,
                             const GURL& password_form_action,
                             const GURL& password_form_frame_url,
+                            const std::string& username,
                             ReusedPasswordType reused_password_type,
                             const std::vector<std::string>& matching_origins,
                             LoginReputationClientRequest::TriggerType type,
@@ -90,6 +91,8 @@
     return trigger_type_;
   }
 
+  const std::string& username() const { return username_; }
+
   ReusedPasswordType reused_password_type() const {
     return reused_password_type_;
   }
@@ -175,6 +178,11 @@
   // Frame url of the detected password form.
   const GURL password_form_frame_url_;
 
+  // The username of the reused password hash. The username can be an email or
+  // a username for a non-GAIA or saved-password reuse. No validation has been
+  // done on it.
+  const std::string& username_;
+
   // Type of the reused password.
   const ReusedPasswordType reused_password_type_;
 
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index 1b08ffd7..866d9a7 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -338,6 +338,7 @@
     const GURL& main_frame_url,
     const GURL& password_form_action,
     const GURL& password_form_frame_url,
+    const std::string& username,
     ReusedPasswordType reused_password_type,
     const std::vector<std::string>& matching_domains,
     LoginReputationClientRequest::TriggerType trigger_type,
@@ -346,8 +347,9 @@
   scoped_refptr<PasswordProtectionRequest> request(
       new PasswordProtectionRequest(
           web_contents, main_frame_url, password_form_action,
-          password_form_frame_url, reused_password_type, matching_domains,
-          trigger_type, password_field_exists, this, GetRequestTimeoutInMS()));
+          password_form_frame_url, username, reused_password_type,
+          matching_domains, trigger_type, password_field_exists, this,
+          GetRequestTimeoutInMS()));
   request->Start();
   pending_requests_.insert(std::move(request));
 }
@@ -363,7 +365,7 @@
                   main_frame_url,
                   PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN, &reason)) {
     StartRequest(web_contents, main_frame_url, password_form_action,
-                 password_form_frame_url,
+                 password_form_frame_url, /* username */ "",
                  PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN,
                  {}, /* matching_domains: not used for this type */
                  LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
@@ -373,6 +375,7 @@
 void PasswordProtectionService::MaybeStartProtectedPasswordEntryRequest(
     WebContents* web_contents,
     const GURL& main_frame_url,
+    const std::string& username,
     ReusedPasswordType reused_password_type,
     const std::vector<std::string>& matching_domains,
     bool password_field_exists) {
@@ -388,25 +391,17 @@
       static_cast<int>(100 * content::ZoomLevelToZoomFactor(zoom_level)));
 
   RequestOutcome reason;
-  bool reported_password_reuse_event = false;
   if (CanSendPing(LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
                   main_frame_url, reused_password_type, &reason)) {
-    StartRequest(web_contents, main_frame_url, GURL(), GURL(),
+    StartRequest(web_contents, main_frame_url, GURL(), GURL(), username,
                  reused_password_type, matching_domains,
                  LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
                  password_field_exists);
-    // TODO(crbug.com/932741): |is_phishing_url| field isn't populated quite
-    // accurately, will resolve in a follow up cl.
-    MaybeReportPasswordReuseDetected(web_contents, reused_password_type, true);
   } else {
     MaybeLogPasswordReuseLookupEvent(web_contents, reason, nullptr);
-    reported_password_reuse_event = true;
   }
   if (CanShowInterstitial(reason, reused_password_type, main_frame_url)) {
     ShowInterstitial(web_contents, reused_password_type);
-    if (!reported_password_reuse_event)
-      MaybeReportPasswordReuseDetected(web_contents, reused_password_type,
-                                       false);
   }
 }
 
@@ -436,13 +431,13 @@
 
 void PasswordProtectionService::RequestFinished(
     PasswordProtectionRequest* request,
-    bool already_cached,
+    RequestOutcome outcome,
     std::unique_ptr<LoginReputationClientResponse> response) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(request);
 
   if (response) {
-    if (!already_cached) {
+    if (outcome != RequestOutcome::RESPONSE_ALREADY_CACHED) {
       CacheVerdict(request->main_frame_url(), request->trigger_type(),
                    request->reused_password_type(), response.get(),
                    base::Time::Now());
@@ -458,6 +453,18 @@
 
   request->HandleDeferredNavigations();
 
+  // If the request is canceled, the PasswordProtectionService is already
+  // partially destroyed, and we won't be able to log accurate metrics.
+  if (outcome != RequestOutcome::CANCELED) {
+    auto verdict =
+        response ? response->verdict_type()
+                 : LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED;
+    auto is_phishing_url = verdict == LoginReputationClientResponse::PHISHING;
+    MaybeReportPasswordReuseDetected(
+        request->web_contents(), request->username(),
+        request->reused_password_type(), is_phishing_url);
+  }
+
   // Remove request from |pending_requests_| list. If it triggers warning, add
   // it into the !warning_reqeusts_| list.
   for (auto it = pending_requests_.begin(); it != pending_requests_.end();
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index 115e699..9153dd00 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -101,6 +101,7 @@
                     const GURL& main_frame_url,
                     const GURL& password_form_action,
                     const GURL& password_form_frame_url,
+                    const std::string& username,
                     ReusedPasswordType reused_password_type,
                     const std::vector<std::string>& matching_domains,
                     LoginReputationClientRequest::TriggerType trigger_type,
@@ -115,6 +116,7 @@
   virtual void MaybeStartProtectedPasswordEntryRequest(
       content::WebContents* web_contents,
       const GURL& main_frame_url,
+      const std::string& username,
       ReusedPasswordType reused_password_type,
       const std::vector<std::string>& matching_domains,
       bool password_field_exists);
@@ -185,6 +187,7 @@
   // Triggers the safeBrowsingPrivate.OnPolicySpecifiedPasswordReuseDetected.
   virtual void MaybeReportPasswordReuseDetected(
       content::WebContents* web_contents,
+      const std::string& username,
       ReusedPasswordType reused_password_type,
       bool is_phishing_url) = 0;
 
@@ -222,7 +225,7 @@
   // itself from |requests_|.
   virtual void RequestFinished(
       PasswordProtectionRequest* request,
-      bool already_cached,
+      RequestOutcome outcome,
       std::unique_ptr<LoginReputationClientResponse> response);
 
   // Cancels all requests in |requests_|, empties it, and releases references to
diff --git a/components/safe_browsing/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
index 2e3b34f..56012c3 100644
--- a/components/safe_browsing/password_protection/password_protection_service_unittest.cc
+++ b/components/safe_browsing/password_protection/password_protection_service_unittest.cc
@@ -46,6 +46,7 @@
 const char kSavedDomain[] = "saved_domain.com";
 const char kSavedDomain2[] = "saved_domain2.com";
 const char kTargetUrl[] = "http://foo.com/";
+const char kUserName[] = "username";
 
 const unsigned int kMinute = 60;
 const unsigned int kDay = 24 * 60 * kMinute;
@@ -105,7 +106,7 @@
 
   void RequestFinished(
       PasswordProtectionRequest* request,
-      bool already_cached_unused,
+      RequestOutcome outcome,
       std::unique_ptr<LoginReputationClientResponse> response) override {
     latest_request_ = request;
     latest_response_ = std::move(response);
@@ -203,7 +204,7 @@
 
     request_ = new PasswordProtectionRequest(
         web_contents, target_url, GURL(kFormActionUrl), GURL(kPasswordFrameUrl),
-        PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN, {},
+        kUserName, PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN, {},
         LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true,
         password_protection_service_.get(), timeout_in_ms);
     request_->Start();
@@ -221,9 +222,9 @@
             Return(match_whitelist ? AsyncMatch::MATCH : AsyncMatch::NO_MATCH));
 
     request_ = new PasswordProtectionRequest(
-        web_contents, target_url, GURL(), GURL(), type, matching_domains,
-        LoginReputationClientRequest::PASSWORD_REUSE_EVENT, true,
-        password_protection_service_.get(), timeout_in_ms);
+        web_contents, target_url, GURL(), GURL(), kUserName, type,
+        matching_domains, LoginReputationClientRequest::PASSWORD_REUSE_EVENT,
+        true, password_protection_service_.get(), timeout_in_ms);
     request_->Start();
   }
 
@@ -979,7 +980,8 @@
       .WillRepeatedly(Return(AsyncMatch::NO_MATCH));
   password_protection_service_->StartRequest(
       GetWebContents(), target_url, GURL("http://foo.com/submit"),
-      GURL("http://foo.com/frame"), PasswordReuseEvent::SAVED_PASSWORD, {},
+      GURL("http://foo.com/frame"), "username",
+      PasswordReuseEvent::SAVED_PASSWORD, {},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
 
   // Destroy password_protection_service_ while there is one request pending.
@@ -1373,7 +1375,7 @@
   test_url_loader_factory_.AddResponse(url_.spec(),
                                        expected_response.SerializeAsString());
   password_protection_service_->StartRequest(
-      GetWebContents(), GURL("about:blank"), GURL(), GURL(),
+      GetWebContents(), GURL("about:blank"), GURL(), GURL(), "username",
       PasswordReuseEvent::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
@@ -1391,13 +1393,14 @@
       .Times(AnyNumber())
       .WillOnce(Return(gfx::Size(1000, 1000)));
   password_protection_service_->StartRequest(
-      GetWebContents(), GURL("about:blank"), GURL(), GURL(),
+      GetWebContents(), GURL("about:blank"), GURL(), GURL(), kUserName,
       PasswordReuseEvent::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
 
   bool is_sber = GetParam();
   if (is_sber) {
+    password_protection_service_->WaitForResponse();
     ASSERT_NE(nullptr, password_protection_service_->GetLatestRequestProto());
     EXPECT_TRUE(password_protection_service_->GetLatestRequestProto()
                     ->has_visual_features());
@@ -1414,11 +1417,12 @@
       .Times(AnyNumber())
       .WillOnce(Return(gfx::Size(1000, 1000)));
   password_protection_service_->StartRequest(
-      GetWebContents(), GURL("about:blank"), GURL(), GURL(),
+      GetWebContents(), GURL("about:blank"), GURL(), GURL(), kUserName,
       PasswordReuseEvent::SAVED_PASSWORD, {"example.com"},
       LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE, true);
   base::RunLoop().RunUntilIdle();
 
+  password_protection_service_->WaitForResponse();
   ASSERT_NE(nullptr, password_protection_service_->GetLatestRequestProto());
   EXPECT_TRUE(password_protection_service_->GetLatestRequestProto()
                   ->has_dom_features());
diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc
index f19aeaf..a8c9a81 100644
--- a/components/sync/driver/data_type_manager_impl.cc
+++ b/components/sync/driver/data_type_manager_impl.cc
@@ -106,7 +106,8 @@
         SyncError(FROM_HERE, syncer::SyncError::UNREADY_ERROR,
                   "Data type is unready.", type));
   } else if (last_requested_types_.Has(type)) {
-    // Only reconfigure if the type is both ready and desired.
+    // Only reconfigure if the type is both ready and desired. This will
+    // internally also update ready state of all other requested types.
     ForceReconfiguration();
   }
 }
diff --git a/components/sync/driver/data_type_manager_impl_unittest.cc b/components/sync/driver/data_type_manager_impl_unittest.cc
index 80da751..4e94aec 100644
--- a/components/sync/driver/data_type_manager_impl_unittest.cc
+++ b/components/sync/driver/data_type_manager_impl_unittest.cc
@@ -1357,7 +1357,8 @@
   SetConfigureStartExpectation();
   SetConfigureDoneExpectation(
       DataTypeManager::OK,
-      BuildStatusTable(ModelTypeSet(), ModelTypeSet(), ModelTypeSet(BOOKMARKS),
+      BuildStatusTable(ModelTypeSet(), ModelTypeSet(),
+                       /*unready_errors=*/ModelTypeSet(BOOKMARKS),
                        ModelTypeSet()));
   Configure(ModelTypeSet(BOOKMARKS));
   FinishDownload(ModelTypeSet(), ModelTypeSet());
@@ -1370,6 +1371,103 @@
   dtm_->ReadyForStartChanged(BOOKMARKS);
   EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
   EXPECT_NE(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
+
+  FinishDownload(ModelTypeSet(), ModelTypeSet());
+  FinishDownload(ModelTypeSet(BOOKMARKS), ModelTypeSet());
+
+  // Set the expectations for the reconfiguration - no unready errors now.
+  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
+  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
+  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_EQ(1U, configurer_.activated_types().Size());
+}
+
+TEST_F(SyncDataTypeManagerImplTest,
+       MultipleUnreadyTypesLaterReadyAtTheSameTime) {
+  AddController(BOOKMARKS);
+  AddController(PREFERENCES);
+  GetController(BOOKMARKS)->SetReadyForStart(false);
+  GetController(PREFERENCES)->SetReadyForStart(false);
+
+  // Both types are never started due to being unready.
+  SetConfigureStartExpectation();
+  SetConfigureDoneExpectation(
+      DataTypeManager::OK,
+      BuildStatusTable(ModelTypeSet(), ModelTypeSet(),
+                       /*unready_errors=*/ModelTypeSet(BOOKMARKS, PREFERENCES),
+                       ModelTypeSet()));
+  Configure(ModelTypeSet(BOOKMARKS, PREFERENCES));
+  FinishDownload(ModelTypeSet(), ModelTypeSet());
+  ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
+  ASSERT_EQ(DataTypeController::NOT_RUNNING,
+            GetController(PREFERENCES)->state());
+  ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  ASSERT_EQ(0U, configurer_.activated_types().Size());
+
+  // Both types should start normally now.
+  GetController(BOOKMARKS)->SetReadyForStart(true);
+  GetController(PREFERENCES)->SetReadyForStart(true);
+
+  // Just triggering state change for one of them causes reconfiguration for all
+  // that are ready to start (which is both BOOKMARKS and PREFERENCES).
+  dtm_->ReadyForStartChanged(BOOKMARKS);
+  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
+  EXPECT_NE(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
+  EXPECT_NE(DataTypeController::NOT_RUNNING,
+            GetController(PREFERENCES)->state());
+
+  FinishDownload(ModelTypeSet(), ModelTypeSet());
+  FinishDownload(ModelTypeSet(BOOKMARKS, PREFERENCES), ModelTypeSet());
+
+  // Set new expectations for the reconfiguration - no unready errors any more.
+  SetConfigureDoneExpectation(DataTypeManager::OK, DataTypeStatusTable());
+  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
+  GetController(PREFERENCES)->FinishStart(DataTypeController::OK);
+  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_EQ(2U, configurer_.activated_types().Size());
+}
+
+TEST_F(SyncDataTypeManagerImplTest, MultipleUnreadyTypesLaterOneOfThemReady) {
+  AddController(BOOKMARKS);
+  AddController(PREFERENCES);
+  GetController(BOOKMARKS)->SetReadyForStart(false);
+  GetController(PREFERENCES)->SetReadyForStart(false);
+
+  // Both types are never started due to being unready.
+  SetConfigureStartExpectation();
+  SetConfigureDoneExpectation(
+      DataTypeManager::OK,
+      BuildStatusTable(ModelTypeSet(), ModelTypeSet(),
+                       /*unready_errors=*/ModelTypeSet(BOOKMARKS, PREFERENCES),
+                       ModelTypeSet()));
+  Configure(ModelTypeSet(BOOKMARKS, PREFERENCES));
+  FinishDownload(ModelTypeSet(), ModelTypeSet());
+  ASSERT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
+  ASSERT_EQ(DataTypeController::NOT_RUNNING,
+            GetController(PREFERENCES)->state());
+  ASSERT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  ASSERT_EQ(0U, configurer_.activated_types().Size());
+
+  // Bookmarks should start normally now. Preferences should still not start.
+  GetController(BOOKMARKS)->SetReadyForStart(true);
+  dtm_->ReadyForStartChanged(BOOKMARKS);
+  EXPECT_EQ(DataTypeManager::CONFIGURING, dtm_->state());
+  EXPECT_NE(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state());
+  EXPECT_EQ(DataTypeController::NOT_RUNNING,
+            GetController(PREFERENCES)->state());
+
+  FinishDownload(ModelTypeSet(), ModelTypeSet());
+  FinishDownload(ModelTypeSet(BOOKMARKS), ModelTypeSet());
+
+  // Set the expectations for the reconfiguration - just prefs are unready now.
+  SetConfigureDoneExpectation(
+      DataTypeManager::OK,
+      BuildStatusTable(ModelTypeSet(), ModelTypeSet(),
+                       /*unready_errors=*/ModelTypeSet(PREFERENCES),
+                       ModelTypeSet()));
+  GetController(BOOKMARKS)->FinishStart(DataTypeController::OK);
+  EXPECT_EQ(DataTypeManager::CONFIGURED, dtm_->state());
+  EXPECT_EQ(1U, configurer_.activated_types().Size());
 }
 
 TEST_F(SyncDataTypeManagerImplTest, NoOpReadyForStartChangedWhileStillUnready) {
diff --git a/components/viz/common/quads/render_pass_unittest.cc b/components/viz/common/quads/render_pass_unittest.cc
index d8b4729..c0daf9f 100644
--- a/components/viz/common/quads/render_pass_unittest.cc
+++ b/components/viz/common/quads/render_pass_unittest.cc
@@ -51,9 +51,8 @@
               actual->transform_to_root_target);
     EXPECT_EQ(expected->damage_rect, actual->damage_rect);
     EXPECT_EQ(expected->filters, actual->filters);
-    EXPECT_EQ(expected->backdrop_filters, expected->backdrop_filters);
-    EXPECT_EQ(expected->backdrop_filter_bounds,
-              expected->backdrop_filter_bounds);
+    EXPECT_EQ(expected->backdrop_filters, actual->backdrop_filters);
+    EXPECT_EQ(expected->backdrop_filter_bounds, actual->backdrop_filter_bounds);
     EXPECT_EQ(expected->has_transparent_background,
               actual->has_transparent_background);
     EXPECT_EQ(expected->generate_mipmap, actual->generate_mipmap);
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc
index 54ca8b5d..197c2cd9 100644
--- a/components/viz/service/display/display_resource_provider.cc
+++ b/components/viz/service/display/display_resource_provider.cc
@@ -556,6 +556,10 @@
   metadata.origin = kTopLeft_GrSurfaceOrigin;
 
   resource->locked_for_external_use = true;
+
+  if (resource->transferable.read_lock_fences_enabled)
+    resource->read_lock_fence = current_read_lock_fence_;
+
   return metadata;
 }
 
@@ -962,10 +966,6 @@
   return true;
 }
 
-void DisplayResourceProvider::SynchronousFence::Wait() {
-  HasPassed();
-}
-
 void DisplayResourceProvider::SynchronousFence::Synchronize() {
   TRACE_EVENT0("viz", "DisplayResourceProvider::SynchronousFence::Synchronize");
   gl_->Finish();
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h
index 4aba922..d242f58 100644
--- a/components/viz/service/display/display_resource_provider.h
+++ b/components/viz/service/display/display_resource_provider.h
@@ -239,7 +239,6 @@
     // ResourceFence implementation.
     void Set() override;
     bool HasPassed() override;
-    void Wait() override;
 
     // Returns true if fence has been set but not yet synchornized.
     bool has_synchronized() const { return has_synchronized_; }
diff --git a/components/viz/service/display/display_resource_provider_unittest.cc b/components/viz/service/display/display_resource_provider_unittest.cc
index 603d896..6e634ae5 100644
--- a/components/viz/service/display/display_resource_provider_unittest.cc
+++ b/components/viz/service/display/display_resource_provider_unittest.cc
@@ -352,7 +352,6 @@
   // ResourceFence implementation.
   void Set() override {}
   bool HasPassed() override { return passed; }
-  void Wait() override {}
 
   bool passed = false;
 
diff --git a/components/viz/service/display/resource_fence.h b/components/viz/service/display/resource_fence.h
index ebfc658..0c9d1af 100644
--- a/components/viz/service/display/resource_fence.h
+++ b/components/viz/service/display/resource_fence.h
@@ -11,14 +11,13 @@
 
 // An abstract interface used to ensure reading from resources passed between
 // client and service does not happen before writing is completed.
-class ResourceFence : public base::RefCounted<ResourceFence> {
+class ResourceFence : public base::RefCountedThreadSafe<ResourceFence> {
  public:
   virtual void Set() = 0;
   virtual bool HasPassed() = 0;
-  virtual void Wait() = 0;
 
  protected:
-  friend class base::RefCounted<ResourceFence>;
+  friend class base::RefCountedThreadSafe<ResourceFence>;
   ResourceFence() = default;
   virtual ~ResourceFence() = default;
 
diff --git a/components/viz/service/display/skia_output_surface.h b/components/viz/service/display/skia_output_surface.h
index 12a3607..325a4077 100644
--- a/components/viz/service/display/skia_output_surface.h
+++ b/components/viz/service/display/skia_output_surface.h
@@ -92,7 +92,10 @@
   // a sync token which can be waited on in a command buffer to ensure the paint
   // operation is completed. This token is released when the GPU ops from
   // painting the render pass have been seen and processed by the GPU main.
-  virtual gpu::SyncToken SubmitPaint() = 0;
+  // Optionally the caller may specify |on_finished| callback to be called after
+  // the GPU has finished processing all submitted commands. The callback may be
+  // called on a different thread.
+  virtual gpu::SyncToken SubmitPaint(base::OnceClosure on_finished) = 0;
 
   // Make a promise SkImage from a render pass id. The render pass has been
   // painted with BeginPaintRenderPass and FinishPaintRenderPass. The format
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index 86a260e..8597d651 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -7,9 +7,11 @@
 #include <string>
 #include <utility>
 
+#include "base/bind.h"
 #include "base/bits.h"
 #include "base/command_line.h"
 #include "base/optional.h"
+#include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/base/math_util.h"
 #include "cc/paint/render_surface_filters.h"
@@ -595,6 +597,22 @@
 
 SkiaRenderer::~SkiaRenderer() = default;
 
+class FrameResourceFence : public ResourceFence {
+ public:
+  FrameResourceFence() = default;
+
+  // ResourceFence implementation.
+  void Set() override { event_.Signal(); }
+  bool HasPassed() override { return event_.IsSignaled(); }
+
+ private:
+  ~FrameResourceFence() override = default;
+
+  base::WaitableEvent event_;
+
+  DISALLOW_COPY_AND_ASSIGN(FrameResourceFence);
+};
+
 bool SkiaRenderer::CanPartialSwap() {
   if (draw_mode_ == DrawMode::DDL)
     return output_surface_->capabilities().supports_post_sub_buffer;
@@ -611,20 +629,23 @@
 
 void SkiaRenderer::BeginDrawingFrame() {
   TRACE_EVENT0("viz", "SkiaRenderer::BeginDrawingFrame");
-  if (draw_mode_ != DrawMode::SKPRECORD)
-    return;
+
+  DCHECK(!current_frame_resource_fence_);
 
   // Copied from GLRenderer.
   scoped_refptr<ResourceFence> read_lock_fence;
   if (sync_queries_) {
     read_lock_fence = sync_queries_->StartNewFrame();
+    current_frame_resource_fence_ = nullptr;
   } else {
-    read_lock_fence =
-        base::MakeRefCounted<DisplayResourceProvider::SynchronousFence>(
-            context_provider_->ContextGL());
+    read_lock_fence = base::MakeRefCounted<FrameResourceFence>();
+    current_frame_resource_fence_ = read_lock_fence;
   }
   resource_provider_->SetReadLockFence(read_lock_fence.get());
 
+  if (draw_mode_ != DrawMode::SKPRECORD)
+    return;
+
   // Insert WaitSyncTokenCHROMIUM on quad resources prior to drawing the
   // frame, so that drawing can proceed without GL context switching
   // interruptions.
@@ -1857,7 +1878,20 @@
       // SubmitPaint to the GPU thread.
       promise_images_.clear();
       yuv_promise_images_.clear();
-      gpu::SyncToken sync_token = skia_output_surface_->SubmitPaint();
+
+      base::OnceClosure on_finished_callback;
+
+      // Signal |current_frame_resource_fence_| when the root render pass is
+      // finished.
+      if (current_frame_resource_fence_ &&
+          current_frame()->current_render_pass ==
+              current_frame()->root_render_pass) {
+        on_finished_callback = base::BindOnce(
+            &ResourceFence::Set, std::move(current_frame_resource_fence_));
+      }
+      gpu::SyncToken sync_token =
+          skia_output_surface_->SubmitPaint(std::move(on_finished_callback));
+
       lock_set_for_external_use_->UnlockResources(sync_token);
       break;
     }
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h
index 1c6afdc6..2ae460a 100644
--- a/components/viz/service/display/skia_renderer.h
+++ b/components/viz/service/display/skia_renderer.h
@@ -205,6 +205,7 @@
   SkCanvas* root_canvas_ = nullptr;
   SkCanvas* current_canvas_ = nullptr;
   SkSurface* current_surface_ = nullptr;
+  scoped_refptr<ResourceFence> current_frame_resource_fence_;
 
   bool disable_picture_quad_image_filtering_ = false;
   bool is_scissor_enabled_ = false;
diff --git a/components/viz/service/display/sync_query_collection.cc b/components/viz/service/display/sync_query_collection.cc
index f68e15d..6a57d807 100644
--- a/components/viz/service/display/sync_query_collection.cc
+++ b/components/viz/service/display/sync_query_collection.cc
@@ -86,10 +86,6 @@
       query_->Set();
     }
     bool HasPassed() override { return !query_ || !query_->IsPending(); }
-    void Wait() override {
-      if (query_)
-        query_->Wait();
-    }
 
    private:
     ~Fence() override {}
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc
index 13b89f2..7a3adda 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -350,7 +350,8 @@
   return recorder_->getCanvas();
 }
 
-gpu::SyncToken SkiaOutputSurfaceImpl::SubmitPaint() {
+gpu::SyncToken SkiaOutputSurfaceImpl::SubmitPaint(
+    base::OnceClosure on_finished) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(recorder_);
 
@@ -386,6 +387,7 @@
       // MakePromiseSkImageFromRenderPass() is called.
       it->second->image = nullptr;
     }
+    DCHECK(!on_finished);
     callback = base::BindOnce(
         &SkiaOutputSurfaceImplOnGpu::FinishPaintRenderPass,
         base::Unretained(impl_on_gpu_.get()), current_render_pass_id_,
@@ -396,7 +398,7 @@
         &SkiaOutputSurfaceImplOnGpu::FinishPaintCurrentFrame,
         base::Unretained(impl_on_gpu_.get()), std::move(ddl),
         std::move(overdraw_ddl), std::move(images_in_current_paint_),
-        resource_sync_tokens_, sync_fence_release_);
+        resource_sync_tokens_, sync_fence_release_, std::move(on_finished));
   }
   images_in_current_paint_.clear();
   ScheduleGpuTask(std::move(callback), std::move(resource_sync_tokens_));
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.h b/components/viz/service/display_embedder/skia_output_surface_impl.h
index 6f9b2c27..45ec8fa 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl.h
@@ -72,7 +72,7 @@
                                  ResourceFormat format,
                                  bool mipmap,
                                  sk_sp<SkColorSpace> color_space) override;
-  gpu::SyncToken SubmitPaint() override;
+  gpu::SyncToken SubmitPaint(base::OnceClosure on_finished) override;
   sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override;
   sk_sp<SkImage> MakePromiseSkImageFromRenderPass(
       const RenderPassId& id,
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
index 538dfa51..dc22ef2 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.cc
@@ -287,7 +287,8 @@
   return sk_current_surface_->getCanvas();
 }
 
-gpu::SyncToken SkiaOutputSurfaceImplNonDDL::SubmitPaint() {
+gpu::SyncToken SkiaOutputSurfaceImplNonDDL::SubmitPaint(
+    base::OnceClosure on_finished) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // To make sure sync_token is valid, we need make sure we are processing a gpu
   // task.
@@ -336,8 +337,12 @@
       .fNumSemaphores = pending_semaphores_.size(),
       .fSignalSemaphores = pending_semaphores_.data(),
   };
-  gpu::CreateCleanupCallbackForSkiaFlush(
+
+  gpu::AddVulkanCleanupTaskForSkiaFlush(
       shared_context_state_->vk_context_provider(), &flush_info);
+  if (on_finished)
+    gpu::AddCleanupTaskForSkiaFlush(std::move(on_finished), &flush_info);
+
   auto result = sk_current_surface_->flush(access, flush_info);
   DCHECK_EQ(result, GrSemaphoresSubmitted::kYes);
   pending_semaphores_.clear();
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
index 763fb22..d2635f7 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_non_ddl.h
@@ -79,7 +79,7 @@
                                  ResourceFormat format,
                                  bool mipmap,
                                  sk_sp<SkColorSpace> color_space) override;
-  gpu::SyncToken SubmitPaint() override;
+  gpu::SyncToken SubmitPaint(base::OnceClosure on_finished) override;
   sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override;
   sk_sp<SkImage> MakePromiseSkImageFromRenderPass(
       const RenderPassId& id,
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 7799fd0..f0a99f1 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -297,24 +297,20 @@
 }
 
 SkiaOutputSurfaceImplOnGpu::SkiaOutputSurfaceImplOnGpu(
+    GpuServiceImpl* gpu_service,
     gpu::SurfaceHandle surface_handle,
-    scoped_refptr<gpu::gles2::FeatureInfo> feature_info,
-    gpu::MailboxManager* mailbox_manager,
-    scoped_refptr<gpu::SyncPointClientState> sync_point_client_state,
-    std::unique_ptr<gpu::SharedImageRepresentationFactory> sir_factory,
-    gpu::raster::GrShaderCache* gr_shader_cache,
-    VulkanContextProvider* vulkan_context_provider,
     const RendererSettings& renderer_settings,
     const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
     const BufferPresentedCallback& buffer_presented_callback,
     const ContextLostCallback& context_lost_callback)
     : surface_handle_(surface_handle),
-      feature_info_(std::move(feature_info)),
-      mailbox_manager_(mailbox_manager),
-      sync_point_client_state_(std::move(sync_point_client_state)),
-      shared_image_representation_factory_(std::move(sir_factory)),
-      gr_shader_cache_(gr_shader_cache),
-      vulkan_context_provider_(vulkan_context_provider),
+      feature_info_(CreateFeatureInfo(gpu_service)),
+      mailbox_manager_(gpu_service->mailbox_manager()),
+      sync_point_client_state_(CreateSyncPointClientState(gpu_service)),
+      shared_image_representation_factory_(
+          CreateSharedImageRepresentationFactory(gpu_service)),
+      gr_shader_cache_(gpu_service->gr_shader_cache()),
+      vulkan_context_provider_(gpu_service->vulkan_context_provider()),
       renderer_settings_(renderer_settings),
       did_swap_buffer_complete_callback_(did_swap_buffer_complete_callback),
       buffer_presented_callback_(buffer_presented_callback),
@@ -322,38 +318,12 @@
       weak_ptr_factory_(this) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
-}
-
-SkiaOutputSurfaceImplOnGpu::SkiaOutputSurfaceImplOnGpu(
-    GpuServiceImpl* gpu_service,
-    gpu::SurfaceHandle surface_handle,
-    const RendererSettings& renderer_settings,
-    const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
-    const BufferPresentedCallback& buffer_presented_callback,
-    const ContextLostCallback& context_lost_callback)
-    : SkiaOutputSurfaceImplOnGpu(
-          surface_handle,
-          CreateFeatureInfo(gpu_service),
-          gpu_service->mailbox_manager(),
-          CreateSyncPointClientState(gpu_service),
-          CreateSharedImageRepresentationFactory(gpu_service),
-          gpu_service->gr_shader_cache(),
-          gpu_service->vulkan_context_provider(),
-          renderer_settings,
-          did_swap_buffer_complete_callback,
-          buffer_presented_callback,
-          context_lost_callback) {
 #if defined(USE_OZONE)
   window_surface_ = ui::OzonePlatform::GetInstance()
                         ->GetSurfaceFactoryOzone()
                         ->CreatePlatformWindowSurface(surface_handle);
 #endif
-  if (gpu_service) {
-    gpu_preferences_ = gpu_service->gpu_channel_manager()->gpu_preferences();
-  } else {
-    auto* command_line = base::CommandLine::ForCurrentProcess();
-    gpu_preferences_ = gpu::gles2::ParseGpuPreferences(command_line);
-  }
+  gpu_preferences_ = gpu_service->gpu_channel_manager()->gpu_preferences();
 
   if (is_using_vulkan())
     InitializeForVulkan(gpu_service);
@@ -412,7 +382,8 @@
     std::unique_ptr<SkDeferredDisplayList> overdraw_ddl,
     std::vector<ImageContext*> image_contexts,
     std::vector<gpu::SyncToken> sync_tokens,
-    uint64_t sync_fence_release) {
+    uint64_t sync_fence_release,
+    base::OnceClosure on_finished) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(ddl);
   DCHECK(output_sk_surface());
@@ -464,8 +435,12 @@
         .fSignalSemaphores =
             scoped_promise_image_access.end_semaphores().data(),
     };
-    gpu::CreateCleanupCallbackForSkiaFlush(vulkan_context_provider_,
-                                           &flush_info);
+
+    gpu::AddVulkanCleanupTaskForSkiaFlush(vulkan_context_provider_,
+                                          &flush_info);
+    if (on_finished)
+      gpu::AddCleanupTaskForSkiaFlush(std::move(on_finished), &flush_info);
+
     auto result = output_sk_surface()->flush(
         SkSurface::BackendSurfaceAccess::kPresent, flush_info);
     if (result != GrSemaphoresSubmitted::kYes &&
@@ -558,8 +533,9 @@
         .fSignalSemaphores =
             scoped_promise_image_access.end_semaphores().data(),
     };
-    gpu::CreateCleanupCallbackForSkiaFlush(vulkan_context_provider_,
-                                           &flush_info);
+
+    gpu::AddVulkanCleanupTaskForSkiaFlush(vulkan_context_provider_,
+                                          &flush_info);
     auto result = offscreen.surface()->flush(
         SkSurface::BackendSurfaceAccess::kNoAccess, flush_info);
     if (result != GrSemaphoresSubmitted::kYes &&
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
index 5c1c03c..6fcbea8a16 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -80,18 +80,6 @@
   using ContextLostCallback = base::RepeatingCallback<void()>;
 
   SkiaOutputSurfaceImplOnGpu(
-      gpu::SurfaceHandle surface_handle,
-      scoped_refptr<gpu::gles2::FeatureInfo> feature_info,
-      gpu::MailboxManager* mailbox_manager,
-      scoped_refptr<gpu::SyncPointClientState> sync_point_client_data,
-      std::unique_ptr<gpu::SharedImageRepresentationFactory> sir_factory,
-      gpu::raster::GrShaderCache* gr_shader_cache,
-      VulkanContextProvider* vulkan_context_provider,
-      const RendererSettings& renderer_settings_,
-      const DidSwapBufferCompleteCallback& did_swap_buffer_complete_callback,
-      const BufferPresentedCallback& buffer_presented_callback,
-      const ContextLostCallback& context_lost_callback);
-  SkiaOutputSurfaceImplOnGpu(
       GpuServiceImpl* gpu_service,
       gpu::SurfaceHandle surface_handle,
       const RendererSettings& renderer_settings_,
@@ -123,7 +111,8 @@
       std::unique_ptr<SkDeferredDisplayList> overdraw_ddl,
       std::vector<ImageContext*> image_contexts,
       std::vector<gpu::SyncToken> sync_tokens,
-      uint64_t sync_fence_release);
+      uint64_t sync_fence_release,
+      base::OnceClosure on_finished);
   void SwapBuffers(OutputSurfaceFrame frame);
   void EnsureBackbuffer() { output_device_->EnsureBackbuffer(); }
   void DiscardBackbuffer() { output_device_->DiscardBackbuffer(); }
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
index dc87230e..0ddd09f 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
@@ -164,7 +164,12 @@
   SkRect rect = SkRect::MakeWH(output_rect.width(), output_rect.height());
   root_canvas->drawRect(rect, paint);
 
-  gpu::SyncToken sync_token = output_surface_->SubmitPaint();
+  bool on_finished_called = false;
+  base::OnceClosure on_finished =
+      base::BindOnce([](bool* result) { *result = true; }, &on_finished_called);
+
+  gpu::SyncToken sync_token =
+      output_surface_->SubmitPaint(std::move(on_finished));
   EXPECT_TRUE(sync_token.HasData());
   base::OnceClosure closure =
       base::BindOnce(&SkiaOutputSurfaceImplTest::CheckSyncTokenOnGpuThread,
@@ -176,6 +181,7 @@
   gpu_service()->scheduler()->ScheduleTask(gpu::Scheduler::Task(
       sequence_id, std::move(closure), std::move(resource_sync_tokens)));
   BlockMainThread();
+  EXPECT_TRUE(on_finished_called);
 
   // Copy the output
   const gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc
index 19c5462f..b7377eb 100644
--- a/components/viz/test/fake_skia_output_surface.cc
+++ b/components/viz/test/fake_skia_output_surface.cc
@@ -193,11 +193,15 @@
   return sk_surface->getCanvas();
 }
 
-gpu::SyncToken FakeSkiaOutputSurface::SubmitPaint() {
+gpu::SyncToken FakeSkiaOutputSurface::SubmitPaint(
+    base::OnceClosure on_finished) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   sk_surfaces_[current_render_pass_id_]->flush();
   current_render_pass_id_ = 0;
 
+  if (on_finished)
+    std::move(on_finished).Run();
+
   gpu::SyncToken sync_token;
   context_provider()->ContextGL()->GenSyncTokenCHROMIUM(sync_token.GetData());
   return sync_token;
diff --git a/components/viz/test/fake_skia_output_surface.h b/components/viz/test/fake_skia_output_surface.h
index 29e0fc83..6a2c039 100644
--- a/components/viz/test/fake_skia_output_surface.h
+++ b/components/viz/test/fake_skia_output_surface.h
@@ -68,7 +68,7 @@
                                  ResourceFormat format,
                                  bool mipmap,
                                  sk_sp<SkColorSpace> color_space) override;
-  gpu::SyncToken SubmitPaint() override;
+  gpu::SyncToken SubmitPaint(base::OnceClosure on_finished) override;
   sk_sp<SkImage> MakePromiseSkImage(const ResourceMetadata& metadata) override;
   sk_sp<SkImage> MakePromiseSkImageFromRenderPass(
       const RenderPassId& id,
diff --git a/content/browser/accessibility/ax_platform_node_win_browsertest.cc b/content/browser/accessibility/ax_platform_node_win_browsertest.cc
index d62650fe..bde75fcd 100644
--- a/content/browser/accessibility/ax_platform_node_win_browsertest.cc
+++ b/content/browser/accessibility/ax_platform_node_win_browsertest.cc
@@ -387,4 +387,37 @@
       ax::mojom::Role::kAlertDialog, &BrowserAccessibility::PlatformGetChild, 0,
       true, true);
 }
+
+IN_PROC_BROWSER_TEST_F(AXPlatformNodeWinBrowserTest,
+                       UIAGetPropertyValueAutomationId) {
+  LoadInitialAccessibilityTreeFromHtml(std::string(R"HTML(
+      <!DOCTYPE html>
+      <html>
+        </body>
+          <div id="id"></div>
+        </body>
+      </html>
+  )HTML"));
+
+  BrowserAccessibility* root_browser_accessibility = GetRootAndAssertNonNull();
+  BrowserAccessibilityComWin* root_browser_accessibility_com_win =
+      ToBrowserAccessibilityWin(root_browser_accessibility)->GetCOM();
+  ASSERT_NE(nullptr, root_browser_accessibility_com_win);
+
+  BrowserAccessibility* browser_accessibility =
+      root_browser_accessibility->PlatformDeepestLastChild();
+  ASSERT_NE(nullptr, browser_accessibility);
+  ASSERT_EQ(ax::mojom::Role::kGenericContainer,
+            browser_accessibility->GetRole());
+  BrowserAccessibilityComWin* browser_accessibility_com_win =
+      ToBrowserAccessibilityWin(browser_accessibility)->GetCOM();
+  ASSERT_NE(nullptr, browser_accessibility_com_win);
+
+  base::win::ScopedVariant expected_scoped_variant;
+  expected_scoped_variant.Set(SysAllocString(L"id"));
+  base::win::ScopedVariant scoped_variant;
+  EXPECT_HRESULT_SUCCEEDED(browser_accessibility_com_win->GetPropertyValue(
+      UIA_AutomationIdPropertyId, scoped_variant.Receive()));
+  EXPECT_EQ(0, expected_scoped_variant.Compare(scoped_variant));
+}
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 69dc4d9..be0a65a 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1189,6 +1189,12 @@
       manager_->ax_tree()->GetReverseRelations(attr, GetData().id));
 }
 
+base::string16 BrowserAccessibility::GetAuthorUniqueId() const {
+  base::string16 html_id;
+  GetData().GetHtmlAttribute("id", &html_id);
+  return html_id;
+}
+
 const ui::AXUniqueId& BrowserAccessibility::GetUniqueId() const {
   // This is not the same as GetData().id which comes from Blink, because
   // those ids are only unique within the Blink process. We need one that is
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index 1327beb..574447b 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -372,6 +372,7 @@
   virtual base::string16 GetText() const;
 
   // AXPlatformNodeDelegate.
+  base::string16 GetAuthorUniqueId() const override;
   const ui::AXNodeData& GetData() const override;
   const ui::AXTreeData& GetTreeData() const override;
   ui::AXNodePosition::AXPositionInstance CreateTextPositionAt(
diff --git a/content/browser/accessibility/browser_accessibility_unittest.cc b/content/browser/accessibility/browser_accessibility_unittest.cc
index f14e11a..183c622 100644
--- a/content/browser/accessibility/browser_accessibility_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_unittest.cc
@@ -565,4 +565,24 @@
                   .ToString());
   }
 }
+
+TEST_F(BrowserAccessibilityTest, GetAuthorUniqueId) {
+  ui::AXNodeData root;
+  root.id = 1;
+  root.role = ax::mojom::Role::kRootWebArea;
+  root.html_attributes.push_back(std::make_pair("id", "my_html_id"));
+
+  std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager(
+      BrowserAccessibilityManager::Create(
+          MakeAXTreeUpdate(root), test_browser_accessibility_delegate_.get(),
+          new BrowserAccessibilityFactory()));
+  ASSERT_NE(nullptr, browser_accessibility_manager.get());
+
+  BrowserAccessibility* root_accessible =
+      browser_accessibility_manager->GetRoot();
+  ASSERT_NE(nullptr, root_accessible);
+
+  ASSERT_EQ(base::WideToUTF16(L"my_html_id"),
+            root_accessible->GetAuthorUniqueId());
+}
 }  // namespace content
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index 0989ed2..41bdc53 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -58,6 +58,7 @@
 #include "content/public/common/service_names.mojom.h"
 #include "media/capabilities/video_decode_stats_db_impl.h"
 #include "media/mojo/services/video_decode_perf_history.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/cookies/cookie_store.h"
 #include "net/ssl/channel_id_service.h"
 #include "net/ssl/channel_id_store.h"
@@ -658,20 +659,20 @@
     // NOTE: Many unit tests create a TestBrowserContext without initializing
     // Mojo or the global service manager connection.
 
-    service_manager::mojom::ServicePtr service;
-    auto service_request = mojo::MakeRequest(&service);
+    mojo::PendingRemote<service_manager::mojom::Service> service;
+    auto service_receiver = service.InitWithNewPipeAndPassReceiver();
 
-    service_manager::mojom::PIDReceiverPtr pid_receiver;
+    mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
     service_manager::Identity identity(mojom::kBrowserServiceName, new_group,
                                        base::Token{},
                                        base::Token::CreateRandom());
     service_manager_connection->GetConnector()->RegisterServiceInstance(
-        identity, std::move(service), mojo::MakeRequest(&pid_receiver));
-    pid_receiver->SetPID(base::GetCurrentProcId());
+        identity, std::move(service), metadata.BindNewPipeAndPassReceiver());
+    metadata->SetPID(base::GetCurrentProcId());
 
     BrowserContextServiceManagerConnectionHolder* connection_holder =
         new BrowserContextServiceManagerConnectionHolder(
-            browser_context, std::move(service_request),
+            browser_context, std::move(service_receiver),
             base::SequencedTaskRunnerHandle::Get());
     browser_context->SetUserData(kServiceManagerConnection,
                                  base::WrapUnique(connection_holder));
diff --git a/content/browser/browsing_instance.cc b/content/browser/browsing_instance.cc
index 0670cda..c00d975 100644
--- a/content/browser/browsing_instance.cc
+++ b/content/browser/browsing_instance.cc
@@ -17,10 +17,6 @@
 
 namespace content {
 
-namespace {
-const char* const kDefaultInstanceSiteURL = "http://unisolated.invalid";
-}  // namespace
-
 // Start the BrowsingInstance ID counter from 1 to avoid a conflict with the
 // invalid BrowsingInstanceId value, which is 0 in its underlying IdType32.
 int BrowsingInstance::next_browsing_instance_id_ = 1;
@@ -123,7 +119,7 @@
     DCHECK(!default_process_);
     if (!default_site_instance_) {
       default_site_instance_ = new SiteInstanceImpl(this);
-      default_site_instance_->SetSite(GURL(kDefaultInstanceSiteURL));
+      default_site_instance_->SetSite(SiteInstanceImpl::GetDefaultSiteURL());
     }
     return default_site_instance_;
   }
diff --git a/content/browser/devtools/devtools_background_services.proto b/content/browser/devtools/devtools_background_services.proto
index 022a17f..8f4c4549 100644
--- a/content/browser/devtools/devtools_background_services.proto
+++ b/content/browser/devtools/devtools_background_services.proto
@@ -10,11 +10,15 @@
 
 // The background service we are logging events for.
 // Do not change the tags since these are persisted.
+// Add a corresponding entry in `enums.xml` if a new value is introduced.
 enum BackgroundService {
   UNKNOWN = 0;
   TEST_BACKGROUND_SERVICE = 1;
   BACKGROUND_FETCH = 2;
   BACKGROUND_SYNC = 3;
+
+  // Keep as last, must have the largest tag value.
+  COUNT = 4;
 }
 
 // A proto for storing the background service event with common metadata for
diff --git a/content/browser/devtools/devtools_background_services_context_impl.h b/content/browser/devtools/devtools_background_services_context_impl.h
index f5222e2f..2a5b560 100644
--- a/content/browser/devtools/devtools_background_services_context_impl.h
+++ b/content/browser/devtools/devtools_background_services_context_impl.h
@@ -131,7 +131,7 @@
   // recorded. The BackgroundService enum is used as the index.
   // This should only be updated on the UI thread, but is also
   // accessed from the IO thread.
-  std::array<base::Time, devtools::proto::BackgroundService_ARRAYSIZE>
+  std::array<base::Time, devtools::proto::BackgroundService::COUNT>
       expiration_times_;
 
   base::ObserverList<EventObserver> observers_;
diff --git a/content/browser/devtools/protocol/background_service_handler.cc b/content/browser/devtools/protocol/background_service_handler.cc
index dc2419a8..17b91e8 100644
--- a/content/browser/devtools/protocol/background_service_handler.cc
+++ b/content/browser/devtools/protocol/background_service_handler.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/devtools/protocol/background_service_handler.h"
 
+#include "base/metrics/histogram_functions.h"
 #include "content/browser/frame_host/frame_tree.h"
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/browser/storage_partition_impl.h"
@@ -188,10 +189,13 @@
   if (service_enum == devtools::proto::BackgroundService::UNKNOWN)
     return Response::InvalidParams("Invalid service name");
 
-  if (should_record)
+  if (should_record) {
     devtools_context_->StartRecording(service_enum);
-  else
+    base::UmaHistogramEnumeration("DevTools.BackgroundService.StartRecording",
+                                  service_enum, devtools::proto::COUNT);
+  } else {
     devtools_context_->StopRecording(service_enum);
+  }
 
   return Response::OK();
 }
diff --git a/content/browser/dom_storage/local_storage_context_mojo_unittest.cc b/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
index fee17f17..cd2b967f 100644
--- a/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
+++ b/content/browser/dom_storage/local_storage_context_mojo_unittest.cc
@@ -37,7 +37,6 @@
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "services/file/public/mojom/constants.mojom.h"
 #include "services/file/user_id_map.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/leveldatabase/env_chromium.h"
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index f4dcfd2..d04e424 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -1737,6 +1737,7 @@
   // |dest_url| should end up in |candidate|'s SiteInstance.
   // This is used to keep same-site scripting working for hosted apps.
   bool should_compare_effective_urls =
+      candidate->GetSiteInstance()->IsDefaultSiteInstance() ||
       GetContentClient()
           ->browser()
           ->ShouldCompareEffectiveURLsForSiteInstanceSelection(
@@ -1744,8 +1745,10 @@
               frame_tree_node_->IsMainFrame(),
               candidate->GetSiteInstance()->original_url(), dest_url);
 
-  bool src_has_effective_url = SiteInstanceImpl::HasEffectiveURL(
-      browser_context, candidate->GetSiteInstance()->original_url());
+  bool src_has_effective_url =
+      !candidate->GetSiteInstance()->IsDefaultSiteInstance() &&
+      SiteInstanceImpl::HasEffectiveURL(
+          browser_context, candidate->GetSiteInstance()->original_url());
   bool dest_has_effective_url =
       SiteInstanceImpl::HasEffectiveURL(browser_context, dest_url);
 
@@ -1772,10 +1775,8 @@
   // original_url() and not the site URL, so that we can do this comparison
   // without the effective URL resolution if needed.
   if (candidate->last_successful_url().is_empty()) {
-    return SiteInstanceImpl::IsSameWebSite(
-        candidate->GetSiteInstance()->GetIsolationContext(),
-        candidate->GetSiteInstance()->original_url(), dest_url,
-        should_compare_effective_urls);
+    return candidate->GetSiteInstance()->IsOriginalUrlSameSite(
+        dest_url, should_compare_effective_urls);
   }
 
   // In the common case, we use the RenderFrameHost's last successful URL. Thus,
@@ -1807,10 +1808,8 @@
   // against the site URL.
   if (candidate->last_successful_url().IsAboutBlank() &&
       candidate->GetLastCommittedOrigin().opaque() &&
-      SiteInstanceImpl::IsSameWebSite(
-          candidate->GetSiteInstance()->GetIsolationContext(),
-          candidate->GetSiteInstance()->original_url(), dest_url,
-          should_compare_effective_urls)) {
+      candidate->GetSiteInstance()->IsOriginalUrlSameSite(
+          dest_url, should_compare_effective_urls)) {
     return true;
   }
 
diff --git a/content/browser/net/reporting_service_proxy.cc b/content/browser/net/reporting_service_proxy.cc
index 8081fd6..38b4037 100644
--- a/content/browser/net/reporting_service_proxy.cc
+++ b/content/browser/net/reporting_service_proxy.cc
@@ -76,36 +76,36 @@
 
   void QueueCspViolationReport(const GURL& url,
                                const std::string& group,
-                               const std::string& document_uri,
-                               const std::string& referrer,
-                               const std::string& violated_directive,
+                               const std::string& document_url,
+                               const base::Optional<std::string>& referrer,
+                               const base::Optional<std::string>& blocked_url,
                                const std::string& effective_directive,
                                const std::string& original_policy,
-                               const std::string& disposition,
-                               const std::string& blocked_uri,
-                               int line_number,
-                               int column_number,
                                const base::Optional<std::string>& source_file,
+                               const base::Optional<std::string>& script_sample,
+                               const std::string& disposition,
                                uint16_t status_code,
-                               const std::string& script_sample) override {
+                               int line_number,
+                               int column_number) override {
     auto body = std::make_unique<base::DictionaryValue>();
-    body->SetString("document-uri", document_uri);
-    body->SetString("referrer", referrer);
-    body->SetString("violated-directive", violated_directive);
-    body->SetString("effective-directive", effective_directive);
-    body->SetString("original-policy", original_policy);
-    body->SetString("disposition", disposition);
-    body->SetString("blocked-uri", blocked_uri);
-    if (line_number)
-      body->SetInteger("line-number", line_number);
-    if (column_number)
-      body->SetInteger("column-number", column_number);
+    body->SetString("documentURL", document_url);
+    if (referrer)
+      body->SetString("referrer", *referrer);
+    if (blocked_url)
+      body->SetString("blockedURL", *blocked_url);
+    body->SetString("effectiveDirective", effective_directive);
+    body->SetString("originalPolicy", original_policy);
     if (source_file)
       body->SetString("sourceFile", *source_file);
-    if (status_code)
-      body->SetInteger("status-code", status_code);
-    body->SetString("script-sample", script_sample);
-    QueueReport(url, group, "csp", std::move(body));
+    if (script_sample)
+      body->SetString("sample", *script_sample);
+    body->SetString("disposition", disposition);
+    body->SetInteger("statusCode", status_code);
+    if (line_number)
+      body->SetInteger("lineNumber", line_number);
+    if (column_number)
+      body->SetInteger("columnNumber", column_number);
+    QueueReport(url, group, "csp-violation", std::move(body));
   }
 
   void QueueFeaturePolicyViolationReport(
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc
index d555ed6..2d06168 100644
--- a/content/browser/service_manager/service_manager_context.cc
+++ b/content/browser/service_manager/service_manager_context.cc
@@ -56,6 +56,7 @@
 #include "media/media_buildflags.h"
 #include "media/mojo/buildflags.h"
 #include "media/mojo/interfaces/constants.mojom.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "services/audio/public/mojom/constants.mojom.h"
@@ -460,13 +461,11 @@
     service_manager_ = std::make_unique<service_manager::ServiceManager>(
         std::move(service_process_launcher_factory), std::move(manifests));
 
-    service_manager::mojom::ServicePtr packaged_services_service;
-    packaged_services_service.Bind(std::move(packaged_services_service_info));
     service_manager_->RegisterService(
         service_manager::Identity(mojom::kPackagedServicesServiceName,
                                   service_manager::kSystemInstanceGroup,
                                   base::Token{}, base::Token::CreateRandom()),
-        std::move(packaged_services_service), nullptr);
+        std::move(packaged_services_service_info), mojo::NullReceiver());
     service_manager_->SetInstanceQuitCallback(
         base::Bind(&OnInstanceQuitOnServiceManagerThread,
                    std::move(ui_thread_task_runner)));
@@ -557,19 +556,19 @@
       base::BindRepeating(&ServiceManagerContext::OnUnhandledServiceRequest,
                           weak_ptr_factory_.GetWeakPtr()));
 
-  service_manager::mojom::ServicePtr root_browser_service;
+  service_manager::mojom::ServicePtrInfo root_browser_service;
   ServiceManagerConnection::SetForProcess(
       ServiceManagerConnection::Create(mojo::MakeRequest(&root_browser_service),
                                        service_manager_thread_task_runner_));
   auto* browser_connection = ServiceManagerConnection::GetForProcess();
 
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
+  mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
   packaged_services_connection_->GetConnector()->RegisterServiceInstance(
       service_manager::Identity(mojom::kBrowserServiceName,
                                 service_manager::kSystemInstanceGroup,
                                 base::Token{}, base::Token::CreateRandom()),
-      std::move(root_browser_service), mojo::MakeRequest(&pid_receiver));
-  pid_receiver->SetPID(base::GetCurrentProcId());
+      std::move(root_browser_service), metadata.BindNewPipeAndPassReceiver());
+  metadata->SetPID(base::GetCurrentProcId());
 
   RegisterInProcessService(
       packaged_services_connection_.get(),
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index 7f8fc40e..e5d990b5 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -8,6 +8,7 @@
 
 #include "base/command_line.h"
 #include "base/debug/crash_logging.h"
+#include "base/lazy_instance.h"
 #include "base/macros.h"
 #include "content/browser/browsing_instance.h"
 #include "content/browser/child_process_security_policy_impl.h"
@@ -32,6 +33,17 @@
 
 int32_t SiteInstanceImpl::next_site_instance_id_ = 1;
 
+// static
+const GURL& SiteInstanceImpl::GetDefaultSiteURL() {
+  struct DefaultSiteURL {
+    const GURL url = GURL("http://unisolated.invalid");
+  };
+  static base::LazyInstance<DefaultSiteURL>::Leaky default_site_url =
+      LAZY_INSTANCE_INITIALIZER;
+
+  return default_site_url.Get().url;
+}
+
 SiteInstanceImpl::SiteInstanceImpl(BrowsingInstance* browsing_instance)
     : id_(next_site_instance_id_++),
       active_frame_count_(0),
@@ -428,11 +440,35 @@
 }
 
 bool SiteInstanceImpl::IsSameSiteWithURL(const GURL& url) {
+  if (IsDefaultSiteInstance()) {
+    // Consider |url| the same site if it could be handled by the
+    // default SiteInstance and we don't already have a SiteInstance for
+    // this URL.
+    // TODO(acolwell): Remove HasSiteInstance() call once we have a way to
+    // prevent SiteInstances with no site URL from being used for URLs
+    // that should be routed to the default SiteInstance.
+    DCHECK_EQ(site_, GetDefaultSiteURL());
+    return site_ == GetSiteForURLInternal(GetIsolationContext(), url,
+                                          true /* should_use_effective_urls */,
+                                          true /* allow_default_site_url */) &&
+           !browsing_instance_->HasSiteInstance(url);
+  }
+
   return SiteInstanceImpl::IsSameWebSite(
       GetIsolationContext(), site_, url,
       true /* should_compare_effective_urls */);
 }
 
+bool SiteInstanceImpl::IsOriginalUrlSameSite(
+    const GURL& dest_url,
+    bool should_compare_effective_urls) {
+  if (IsDefaultSiteInstance())
+    return IsSameSiteWithURL(dest_url);
+
+  return IsSameWebSite(GetIsolationContext(), original_url_, dest_url,
+                       should_compare_effective_urls);
+}
+
 // static
 bool SiteInstanceImpl::IsSameWebSite(const IsolationContext& isolation_context,
                                      const GURL& real_src_url,
@@ -442,6 +478,7 @@
   BrowserContext* browser_context =
       isolation_context.browser_or_resource_context().ToBrowserContext();
   DCHECK(browser_context);
+  DCHECK_NE(real_src_url, GetDefaultSiteURL());
 
   GURL src_url =
       should_compare_effective_urls
@@ -543,21 +580,24 @@
   // For the process lock URL, convert |url| to a site without resolving |url|
   // to an effective URL.
   return SiteInstanceImpl::GetSiteForURLInternal(
-      isolation_context, url, false /* should_use_effective_urls */);
+      isolation_context, url, false /* should_use_effective_urls */,
+      false /* allow_default_site_url */);
 }
 
 // static
 GURL SiteInstanceImpl::GetSiteForURL(const IsolationContext& isolation_context,
                                      const GURL& real_url) {
   return GetSiteForURLInternal(isolation_context, real_url,
-                               true /* should_use_effective_urls */);
+                               true /* should_use_effective_urls */,
+                               false /* allow_default_site_url */);
 }
 
 // static
 GURL SiteInstanceImpl::GetSiteForURLInternal(
     const IsolationContext& isolation_context,
     const GURL& real_url,
-    bool should_use_effective_urls) {
+    bool should_use_effective_urls,
+    bool allow_default_site_url) {
   // TODO(fsamuel, creis): For some reason appID is not recognized as a host.
   if (real_url.SchemeIs(kGuestScheme))
     return real_url;
@@ -576,11 +616,12 @@
   // If the url has a host, then determine the site.  Skip file URLs to avoid a
   // situation where site URL of file://localhost/ would mismatch Blink's origin
   // (which ignores the hostname in this case - see https://crbug.com/776160).
+  GURL site_url;
   if (!origin.host().empty() && origin.scheme() != url::kFileScheme) {
     if (SiteIsolationPolicy::IsStrictOriginIsolationEnabled())
       return origin.GetURL();
 
-    GURL site_url(GetSiteForOrigin(origin));
+    site_url = GetSiteForOrigin(origin);
 
     // Isolated origins should use the full origin as their site URL. A
     // subdomain of an isolated origin should also use that isolated origin's
@@ -603,62 +644,69 @@
     if (should_use_effective_urls && url != real_url) {
       std::string non_translated_site_url(
           GetSiteForURLInternal(isolation_context, real_url,
-                                false /* should_use_effective_urls */)
+                                false /* should_use_effective_urls */,
+                                allow_default_site_url)
               .spec());
       GURL::Replacements replacements;
       replacements.SetRefStr(non_translated_site_url.c_str());
       site_url = site_url.ReplaceComponents(replacements);
     }
-
-    return site_url;
-  }
-
-  // If there is no host but there is a scheme, return the scheme.
-  // This is useful for cases like file URLs.
-  if (!origin.opaque()) {
-    // Prefer to use the scheme of |origin| rather than |url|, to correctly
-    // cover blob:file: and filesystem:file: URIs (see also
-    // https://crbug.com/697111).
-    DCHECK(!origin.scheme().empty());
-    return GURL(origin.scheme() + ":");
-  } else if (url.has_scheme()) {
-    // In some cases, it is not safe to use just the scheme as a site URL, as
-    // that might allow two URLs created by different sites to share a process.
-    // See https://crbug.com/863623 and https://crbug.com/863069.
-    //
-    // TODO(alexmos,creis): This should eventually be expanded to certain other
-    // schemes, such as file:.
-    // TODO(creis): This currently causes problems with tests on Android and
-    // Android WebView.  For now, skip it when Site Isolation is not enabled,
-    // since there's no need to isolate data and blob URLs from each other in
-    // that case.
-    bool is_site_isolation_enabled =
-        SiteIsolationPolicy::UseDedicatedProcessesForAllSites() ||
-        SiteIsolationPolicy::AreIsolatedOriginsEnabled();
-    if (is_site_isolation_enabled &&
-        (url.SchemeIsBlob() || url.scheme() == url::kDataScheme)) {
-      // We get here for blob URLs of form blob:null/guid.  Use the full URL
-      // with the guid in that case, which isolates all blob URLs with unique
-      // origins from each other.  We also get here for browser-initiated
-      // navigations to data URLs, which have a unique origin and should only
-      // share a process when they are identical.  Remove hash from the URL in
-      // either case, since same-document navigations shouldn't use a different
-      // site URL.
-      if (url.has_ref()) {
-        GURL::Replacements replacements;
-        replacements.ClearRef();
-        url = url.ReplaceComponents(replacements);
+  } else {
+    // If there is no host but there is a scheme, return the scheme.
+    // This is useful for cases like file URLs.
+    if (!origin.opaque()) {
+      // Prefer to use the scheme of |origin| rather than |url|, to correctly
+      // cover blob:file: and filesystem:file: URIs (see also
+      // https://crbug.com/697111).
+      DCHECK(!origin.scheme().empty());
+      site_url = GURL(origin.scheme() + ":");
+    } else if (url.has_scheme()) {
+      // In some cases, it is not safe to use just the scheme as a site URL, as
+      // that might allow two URLs created by different sites to share a
+      // process. See https://crbug.com/863623 and https://crbug.com/863069.
+      //
+      // TODO(alexmos,creis): This should eventually be expanded to certain
+      // other schemes, such as file:.
+      // TODO(creis): This currently causes problems with tests on Android and
+      // Android WebView.  For now, skip it when Site Isolation is not enabled,
+      // since there's no need to isolate data and blob URLs from each other in
+      // that case.
+      bool is_site_isolation_enabled =
+          SiteIsolationPolicy::UseDedicatedProcessesForAllSites() ||
+          SiteIsolationPolicy::AreIsolatedOriginsEnabled();
+      if (is_site_isolation_enabled &&
+          (url.SchemeIsBlob() || url.scheme() == url::kDataScheme)) {
+        // We get here for blob URLs of form blob:null/guid.  Use the full URL
+        // with the guid in that case, which isolates all blob URLs with unique
+        // origins from each other.  We also get here for browser-initiated
+        // navigations to data URLs, which have a unique origin and should only
+        // share a process when they are identical.  Remove hash from the URL in
+        // either case, since same-document navigations shouldn't use a
+        // different site URL.
+        if (url.has_ref()) {
+          GURL::Replacements replacements;
+          replacements.ClearRef();
+          url = url.ReplaceComponents(replacements);
+        }
+        site_url = url;
+      } else {
+        DCHECK(!url.scheme().empty());
+        site_url = GURL(url.scheme() + ":");
       }
-      return url;
+    } else {
+      // Otherwise the URL should be invalid; return an empty site.
+      DCHECK(!url.is_valid()) << url;
+      return GURL();
     }
-
-    DCHECK(!url.scheme().empty());
-    return GURL(url.scheme() + ":");
   }
 
-  // Otherwise the URL should be invalid; return an empty site.
-  DCHECK(!url.is_valid()) << url;
-  return GURL();
+  if (allow_default_site_url &&
+      !base::FeatureList::IsEnabled(
+          features::kProcessSharingWithStrictSiteInstances) &&
+      !DoesSiteURLRequireDedicatedProcess(isolation_context, site_url)) {
+    return GetDefaultSiteURL();
+  }
+  return site_url;
 }
 
 // static
diff --git a/content/browser/site_instance_impl.h b/content/browser/site_instance_impl.h
index 1543b5a..a535477 100644
--- a/content/browser/site_instance_impl.h
+++ b/content/browser/site_instance_impl.h
@@ -121,7 +121,16 @@
 
   // Returns the URL which was used to set the |site_| for this SiteInstance.
   // May be empty if this SiteInstance does not have a |site_|.
-  const GURL& original_url() { return original_url_; }
+  const GURL& original_url() {
+    DCHECK(!IsDefaultSiteInstance());
+    return original_url_;
+  }
+
+  // Returns true if |original_url()| is the same site as
+  // |dest_url| or this object is a default SiteInstance and can be
+  // considered the same site as |dest_url|.
+  bool IsOriginalUrlSameSite(const GURL& dest_url,
+                             bool should_compare_effective_urls);
 
   // Returns the URL which should be used in a LockToOrigin call for this
   // SiteInstance's process.  This is the same as |site_| except for cases
@@ -220,6 +229,9 @@
   // - SiteInstanceImpl::CanAssociateWithSpareProcess().
   void PreventAssociationWithSpareProcess();
 
+  // Returns the special site URL used by the default SiteInstance.
+  static const GURL& GetDefaultSiteURL();
+
   // Get the effective URL for the given actual URL.  This allows the
   // ContentBrowserClient to override the SiteInstance's site for certain URLs.
   // For example, Chrome uses this to replace hosted app URLs with extension
@@ -316,9 +328,12 @@
   // |should_use_effective_urls| specifies whether to resolve |url| to an
   // effective URL (via ContentBrowserClient::GetEffectiveURL()) before
   // determining the site.
+  // |allow_default_site_url| specifies whether the default SiteInstance site
+  // URL is allowed to be returned.
   static GURL GetSiteForURLInternal(const IsolationContext& isolation_context,
                                     const GURL& url,
-                                    bool should_use_effective_urls);
+                                    bool should_use_effective_urls,
+                                    bool allow_default_site_url);
 
   // Returns true if pages loaded from |site_url| ought to be handled only by a
   // renderer process isolated from other sites. If --site-per-process is used,
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index 24287b4..40c1e24 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -440,11 +440,13 @@
   GURL expected_app_site_url(app_url.spec() + "#" + nonapp_site_url.spec());
   {
     GURL site_url = SiteInstanceImpl::GetSiteForURLInternal(
-        isolation_context, test_url, false /* use_effective_urls */);
+        isolation_context, test_url, false /* use_effective_urls */,
+        false /* allow_default_site_url */);
     EXPECT_EQ(nonapp_site_url, site_url);
 
     site_url = SiteInstanceImpl::GetSiteForURLInternal(
-        isolation_context, test_url, true /* use_effective_urls */);
+        isolation_context, test_url, true /* use_effective_urls */,
+        false /* allow_default_site_url */);
     EXPECT_EQ(expected_app_site_url, site_url);
   }
 
diff --git a/content/common/service_manager/child_connection.cc b/content/common/service_manager/child_connection.cc
index 6f643029..b359c59 100644
--- a/content/common/service_manager/child_connection.cc
+++ b/content/common/service_manager/child_connection.cc
@@ -14,6 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "content/common/child.mojom.h"
 #include "content/public/common/service_manager_connection.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/identity.h"
@@ -87,27 +88,26 @@
   void InitializeOnIOThread(
       const service_manager::Identity& child_identity,
       mojo::ScopedMessagePipeHandle service_pipe) {
-    service_manager::mojom::ServicePtr service;
-    service.Bind(mojo::InterfacePtrInfo<service_manager::mojom::Service>(
-        std::move(service_pipe), 0u));
-    auto pid_receiver_request = mojo::MakeRequest(&pid_receiver_);
-
+    auto metadata_receiver = remote_metadata_.BindNewPipeAndPassReceiver();
     if (connector_) {
-      connector_->RegisterServiceInstance(child_identity, std::move(service),
-                                          std::move(pid_receiver_request));
+      connector_->RegisterServiceInstance(
+          child_identity,
+          mojo::PendingRemote<service_manager::mojom::Service>(
+              std::move(service_pipe), 0),
+          std::move(metadata_receiver));
       connector_->BindInterface(child_identity, &child_);
     }
   }
 
   void ShutDownOnIOThread() {
     connector_.reset();
-    pid_receiver_.reset();
+    remote_metadata_.reset();
   }
 
   void SetProcessOnIOThread(base::Process process) {
-    DCHECK(pid_receiver_.is_bound());
-    pid_receiver_->SetPID(process.Pid());
-    pid_receiver_.reset();
+    DCHECK(remote_metadata_);
+    remote_metadata_->SetPID(process.Pid());
+    remote_metadata_.reset();
     process_ = std::move(process);
   }
 
@@ -119,7 +119,7 @@
   service_manager::Identity child_identity_;
   // ServiceManagerConnection in the child monitors the lifetime of this pipe.
   mojom::ChildPtr child_;
-  service_manager::mojom::PIDReceiverPtr pid_receiver_;
+  mojo::Remote<service_manager::mojom::ProcessMetadata> remote_metadata_;
   // Hold onto the process, and thus its process handle, so that the pid will
   // remain valid.
   base::Process process_;
diff --git a/content/common/service_manager/service_manager_connection_impl_unittest.cc b/content/common/service_manager/service_manager_connection_impl_unittest.cc
index f5e49fb5..f037b6b2 100644
--- a/content/common/service_manager/service_manager_connection_impl_unittest.cc
+++ b/content/common/service_manager/service_manager_connection_impl_unittest.cc
@@ -9,10 +9,10 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace content {
@@ -37,22 +37,15 @@
                             [&event](service_manager::mojom::ServiceRequest) {
                               event.Signal();
                             }));
-
   connection.Start();
-  service_manager::BindSourceInfo source_info(
-      service_manager::Identity(service_manager::mojom::kServiceName,
-                                service_manager::kSystemInstanceGroup,
-                                base::Token{}, base::Token::CreateRandom()),
-      service_manager::CapabilitySet());
-  service_manager::mojom::ServiceFactoryPtr factory;
-  service->OnBindInterface(
-      source_info, service_manager::mojom::ServiceFactory::Name_,
-      mojo::MakeRequest(&factory).PassMessagePipe(), base::DoNothing());
-  service_manager::mojom::ServicePtr created_service;
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
-  mojo::MakeRequest(&pid_receiver);
-  factory->CreateService(mojo::MakeRequest(&created_service), kTestServiceName,
-                         std::move(pid_receiver));
+
+  mojo::PendingRemote<service_manager::mojom::Service> packaged_service;
+  mojo::PendingRemote<service_manager::mojom::ProcessMetadata> metadata;
+  ignore_result(metadata.InitWithNewPipeAndPassReceiver());
+  service->CreatePackagedServiceInstance(
+      service_manager::Identity(kTestServiceName, base::Token::CreateRandom(),
+                                base::Token(), base::Token::CreateRandom()),
+      packaged_service.InitWithNewPipeAndPassReceiver(), std::move(metadata));
   event.Wait();
 }
 
diff --git a/device/bluetooth/bluetooth_adapter.cc b/device/bluetooth/bluetooth_adapter.cc
index d445aadb..79bb58d 100644
--- a/device/bluetooth/bluetooth_adapter.cc
+++ b/device/bluetooth/bluetooth_adapter.cc
@@ -304,8 +304,13 @@
     const std::vector<uint8_t>& value) {
   DCHECK_EQ(characteristic->GetService()->GetDevice()->GetAdapter(), this);
 
-  for (auto& observer : observers_)
+  base::WeakPtr<BluetoothRemoteGattCharacteristic> weak_characteristic =
+      characteristic->GetWeakPtr();
+  for (auto& observer : observers_) {
+    if (!weak_characteristic)
+      break;
     observer.GattCharacteristicValueChanged(this, characteristic, value);
+  }
 }
 
 void BluetoothAdapter::NotifyGattDescriptorValueChanged(
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
index d371f32..6fcf029 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
 #include "device/bluetooth/bluetooth_remote_gatt_service.h"
+#include "device/bluetooth/test/mock_bluetooth_adapter.h"
 #include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -31,6 +32,9 @@
 #include "device/bluetooth/test/bluetooth_test_fuchsia.h"
 #endif
 
+using testing::_;
+using testing::Invoke;
+
 namespace device {
 
 class BluetoothRemoteGattCharacteristicTest :
@@ -3117,6 +3121,60 @@
   EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count());
 }
 
+// Tests that closing the GATT connection during a characteristic
+// value notification is safe.
+#if defined(OS_ANDROID) || defined(OS_MACOSX)
+#define MAYBE_GattCharacteristicValueChanged_DisconnectDuring \
+  GattCharacteristicValueChanged_DisconnectDuring
+#else
+#define MAYBE_GattCharacteristicValueChanged_DisconnectDuring \
+  DISABLED_GattCharacteristicValueChanged_DisconnectDuring
+#endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       GattCharacteristicValueChanged_DisconnectDuring) {
+#else
+TEST_F(BluetoothRemoteGattCharacteristicTest,
+       MAYBE_GattCharacteristicValueChanged_DisconnectDuring) {
+#endif
+  if (!PlatformSupportsLowEnergy()) {
+    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
+    return;
+  }
+  ASSERT_NO_FATAL_FAILURE(StartNotifyBoilerplate(
+      /* properties: NOTIFY */ 0x10, NotifyValueState::NOTIFY));
+  MockBluetoothAdapter::Observer observer1(adapter_);
+  MockBluetoothAdapter::Observer observer2(adapter_);
+
+  // |observer1| will be notified first and close the GATT connection which
+  // may prevent |observer2| from being notified if |characteristic1_| has been
+  // freed.
+  base::RunLoop loop;
+  EXPECT_CALL(observer1, GattCharacteristicValueChanged(adapter_.get(),
+                                                        characteristic1_, _))
+      .WillOnce(
+          Invoke([&](BluetoothAdapter*, BluetoothRemoteGattCharacteristic*,
+                     const std::vector<uint8_t>& value) {
+            gatt_connections_[0]->Disconnect();
+            loop.Quit();
+          }));
+  EXPECT_CALL(observer2, GattCharacteristicValueChanged(adapter_.get(),
+                                                        characteristic1_, _))
+      .Times(testing::AtMost(1))
+      .WillRepeatedly(
+          Invoke([&](BluetoothAdapter*,
+                     BluetoothRemoteGattCharacteristic* characteristic,
+                     const std::vector<uint8_t>& value) {
+            // Call a method on |characteristic| to check the pointer is still
+            // valid.
+            EXPECT_EQ(value, characteristic->GetValue());
+          }));
+
+  std::vector<uint8_t> empty_vector;
+  SimulateGattCharacteristicChanged(characteristic1_, empty_vector);
+  loop.Run();
+}
+
 #if defined(OS_ANDROID)
 #define MAYBE_GetDescriptors_FindNone GetDescriptors_FindNone
 #else
diff --git a/device/bluetooth/test/mock_bluetooth_adapter.cc b/device/bluetooth/test/mock_bluetooth_adapter.cc
index 363bd10d..29932eb4 100644
--- a/device/bluetooth/test/mock_bluetooth_adapter.cc
+++ b/device/bluetooth/test/mock_bluetooth_adapter.cc
@@ -15,8 +15,15 @@
 using testing::Invoke;
 using testing::_;
 
-MockBluetoothAdapter::Observer::Observer() = default;
-MockBluetoothAdapter::Observer::~Observer() = default;
+MockBluetoothAdapter::Observer::Observer(
+    scoped_refptr<BluetoothAdapter> adapter)
+    : adapter_(std::move(adapter)) {
+  adapter_->AddObserver(this);
+}
+
+MockBluetoothAdapter::Observer::~Observer() {
+  adapter_->RemoveObserver(this);
+}
 
 MockBluetoothAdapter::MockBluetoothAdapter() {
   ON_CALL(*this, AddObserver(_))
diff --git a/device/bluetooth/test/mock_bluetooth_adapter.h b/device/bluetooth/test/mock_bluetooth_adapter.h
index b33944e..e08a87be 100644
--- a/device/bluetooth/test/mock_bluetooth_adapter.h
+++ b/device/bluetooth/test/mock_bluetooth_adapter.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/callback.h"
+#include "base/macros.h"
 #include "build/build_config.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 #include "device/bluetooth/bluetooth_device.h"
@@ -23,7 +24,7 @@
  public:
   class Observer : public BluetoothAdapter::Observer {
    public:
-    Observer();
+    Observer(scoped_refptr<BluetoothAdapter> adapter);
     ~Observer() override;
 
     MOCK_METHOD2(AdapterPresentChanged, void(BluetoothAdapter*, bool));
@@ -32,6 +33,15 @@
     MOCK_METHOD2(DeviceAdded, void(BluetoothAdapter*, BluetoothDevice*));
     MOCK_METHOD2(DeviceChanged, void(BluetoothAdapter*, BluetoothDevice*));
     MOCK_METHOD2(DeviceRemoved, void(BluetoothAdapter*, BluetoothDevice*));
+    MOCK_METHOD3(GattCharacteristicValueChanged,
+                 void(BluetoothAdapter*,
+                      BluetoothRemoteGattCharacteristic*,
+                      const std::vector<uint8_t>&));
+
+   private:
+    const scoped_refptr<BluetoothAdapter> adapter_;
+
+    DISALLOW_COPY_AND_ASSIGN(Observer);
   };
 
   MockBluetoothAdapter();
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
index a83cb1f..012548b 100644
--- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
+++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
@@ -431,8 +431,6 @@
 
 extensions::ScriptExecutor*
 WebViewInternalExecuteCodeFunction::GetScriptExecutor(std::string* error) {
-  if (!render_frame_host() || !render_frame_host()->GetProcess())
-    return nullptr;
   WebViewGuest* guest =
       WebViewGuest::From(source_process_id(), guest_instance_id_);
   if (!guest)
@@ -452,8 +450,6 @@
 bool WebViewInternalExecuteCodeFunction::LoadFileForWebUI(
     const std::string& file_src,
     WebUIURLFetcher::WebUILoadFileCallback callback) {
-  if (!render_frame_host() || !render_frame_host()->GetProcess())
-    return false;
   WebViewGuest* guest =
       WebViewGuest::From(source_process_id(), guest_instance_id_);
   if (!guest || host_id().type() != HostID::WEBUI)
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
index c6cdc0bd..a97320d1 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.cc
@@ -72,33 +72,6 @@
 
 }  // namespace
 
-MimeHandlerViewAttachHelper::GuestEmbedderFrameLifetimeObserver::
-    GuestEmbedderFrameLifetimeObserver(MimeHandlerViewGuest* guest_view,
-                                       MimeHandlerViewAttachHelper* helper)
-    : content::WebContentsObserver(content::WebContents::FromRenderFrameHost(
-          guest_view->GetEmbedderFrame())),
-      guest_view_(guest_view),
-      attach_helper_(helper) {}
-
-MimeHandlerViewAttachHelper::GuestEmbedderFrameLifetimeObserver::
-    ~GuestEmbedderFrameLifetimeObserver() {}
-
-void MimeHandlerViewAttachHelper::GuestEmbedderFrameLifetimeObserver::
-    RenderFrameDeleted(RenderFrameHost* render_frame_host) {
-  if (render_frame_host != guest_view_->GetEmbedderFrame())
-    return;
-  // This could happen if the embedder frame of MHVG goes away during
-  // attaching (https://crbug.com/959572).
-  int32_t instance_id = guest_view_->element_instance_id();
-  guest_view_->Destroy(true /* also_delete */);
-  // Erasing from helper map will end up destroying |this|.
-  attach_helper_->pending_guests_.erase(instance_id);
-}
-
-void MimeHandlerViewAttachHelper::GuestEmbedderFrameLifetimeObserver::
-    FrameDeleted(RenderFrameHost* render_frame_host) {
-  RenderFrameDeleted(render_frame_host);
-}
 
 // static
 MimeHandlerViewAttachHelper* MimeHandlerViewAttachHelper::Get(
@@ -152,8 +125,7 @@
     int32_t element_instance_id,
     bool is_full_page_plugin) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  pending_guests_[element_instance_id] =
-      std::make_unique<GuestEmbedderFrameLifetimeObserver>(guest_view, this);
+  pending_guests_[element_instance_id] = guest_view;
   outer_contents_frame->PrepareForInnerWebContentsAttach(base::BindOnce(
       &MimeHandlerViewAttachHelper::ResumeAttachOrDestroy,
       weak_factory_.GetWeakPtr(), element_instance_id, is_full_page_plugin));
@@ -182,12 +154,8 @@
     bool is_full_page_plugin,
     content::RenderFrameHost* plugin_rfh) {
   DCHECK(!plugin_rfh || (plugin_rfh->GetProcess() == render_process_host_));
-  auto it = pending_guests_.find(element_instance_id);
-  auto* guest_view =
-      (it != pending_guests_.end()) ? it->second->guest_view() : nullptr;
-  if (!guest_view)
-    return;
-  pending_guests_.erase(it);
+  auto* guest_view = pending_guests_[element_instance_id];
+  pending_guests_.erase(element_instance_id);
   if (!plugin_rfh) {
     mojom::MimeHandlerViewContainerManagerPtr container_manager;
     guest_view->GetEmbedderFrame()->GetRemoteInterfaces()->GetInterface(
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h
index 8820d3b..5ddf78b 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h
@@ -13,7 +13,6 @@
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "content/public/browser/render_process_host_observer.h"
-#include "content/public/browser/web_contents_observer.h"
 #include "extensions/common/mojo/guest_view.mojom.h"
 
 namespace content {
@@ -67,28 +66,6 @@
                                 bool is_full_page_plugin);
 
  private:
-  // Helper class which tracks the lifetime of the embedder frame of a GuestView
-  // from the time AttachToOuterWebContents is called to when the GuestView is
-  // fully attached to its embedder.
-  class GuestEmbedderFrameLifetimeObserver
-      : public content::WebContentsObserver {
-   public:
-    GuestEmbedderFrameLifetimeObserver(MimeHandlerViewGuest* guest_view,
-                                       MimeHandlerViewAttachHelper* helper);
-    ~GuestEmbedderFrameLifetimeObserver() override;
-
-    MimeHandlerViewGuest* guest_view() const { return guest_view_; }
-
-    void RenderFrameDeleted(
-        content::RenderFrameHost* render_frame_host) override;
-    void FrameDeleted(content::RenderFrameHost* render_frame_host) override;
-
-   private:
-    MimeHandlerViewGuest* const guest_view_;
-    MimeHandlerViewAttachHelper* const attach_helper_;
-  };
-  friend class GuestEmbedderFrameLifetimeObserver;
-
   // Called after the content layer finishes preparing a frame for attaching to
   // the embedder WebContents. If |plugin_rfh| is nullptr then attaching is not
   // possible and the guest should be destroyed; otherwise it is safe to proceed
@@ -109,8 +86,7 @@
 
   MimeHandlerViewAttachHelper(content::RenderProcessHost* render_process_host);
 
-  base::flat_map<int32_t, std::unique_ptr<GuestEmbedderFrameLifetimeObserver>>
-      pending_guests_;
+  base::flat_map<int32_t, MimeHandlerViewGuest*> pending_guests_;
 
   content::RenderProcessHost* const render_process_host_;
 
diff --git a/gpu/command_buffer/service/external_vk_image_factory.cc b/gpu/command_buffer/service/external_vk_image_factory.cc
index d8f3fe0..2b895efb 100644
--- a/gpu/command_buffer/service/external_vk_image_factory.cc
+++ b/gpu/command_buffer/service/external_vk_image_factory.cc
@@ -13,6 +13,7 @@
 #include "gpu/vulkan/vulkan_command_buffer.h"
 #include "gpu/vulkan/vulkan_command_pool.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
+#include "gpu/vulkan/vulkan_fence_helper.h"
 #include "gpu/vulkan/vulkan_function_pointers.h"
 #include "gpu/vulkan/vulkan_implementation.h"
 #include "third_party/skia/include/core/SkPromiseImageTexture.h"
@@ -26,8 +27,10 @@
 
 ExternalVkImageFactory::~ExternalVkImageFactory() {
   if (command_pool_) {
-    command_pool_->Destroy();
-    command_pool_.reset();
+    context_state_->vk_context_provider()
+        ->GetDeviceQueue()
+        ->GetFenceHelper()
+        ->EnqueueVulkanObjectCleanupForSubmittedWork(std::move(command_pool_));
   }
 }
 
@@ -204,11 +207,11 @@
     return nullptr;
   }
   vk_backing->EndAccess(false /* readonly */, std::move(semaphore_handle));
-  VkQueue queue =
-      context_state_->vk_context_provider()->GetDeviceQueue()->GetVulkanQueue();
-  // TODO(https://crbug.com/932260): avoid blocking CPU thread.
-  vkQueueWaitIdle(queue);
-  vkDestroySemaphore(device, semaphore, nullptr /* pAllocator */);
+
+  context_state_->vk_context_provider()
+      ->GetDeviceQueue()
+      ->GetFenceHelper()
+      ->EnqueueSemaphoreCleanupForSubmittedWork(semaphore);
 
   return backing;
 }
@@ -335,14 +338,11 @@
                          nullptr, 0, nullptr, 1, &image_memory_barrier);
   }
   command_buffer->Submit(0, nullptr, 0, nullptr);
-  // TODO(crbug.com/932260): Remove blocking call to VkQueueWaitIdle once we
-  // have a better approach for determining when |command_buffer| is safe to
-  // destroy.
-  vkQueueWaitIdle(context_state_->vk_context_provider()
-                      ->GetDeviceQueue()
-                      ->GetVulkanQueue());
-  command_buffer->Destroy();
-  command_buffer.reset();
+
+  context_state_->vk_context_provider()
+      ->GetDeviceQueue()
+      ->GetFenceHelper()
+      ->EnqueueVulkanObjectCleanupForSubmittedWork(std::move(command_buffer));
 }
 
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index d501f10..819e523 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -780,7 +780,7 @@
           .fNumSemaphores = end_semaphores_.size(),
           .fSignalSemaphores = end_semaphores_.data(),
       };
-      CreateCleanupCallbackForSkiaFlush(
+      AddVulkanCleanupTaskForSkiaFlush(
           shared_context_state_->vk_context_provider(), &flush_info);
       auto result = sk_surface_->flush(
           SkSurface::BackendSurfaceAccess::kPresent, flush_info);
@@ -2230,7 +2230,7 @@
         .fNumSemaphores = end_semaphores_.size(),
         .fSignalSemaphores = end_semaphores_.data(),
     };
-    CreateCleanupCallbackForSkiaFlush(
+    AddVulkanCleanupTaskForSkiaFlush(
         shared_context_state_->vk_context_provider(), &flush_info);
     if (use_ddl_) {
       // TODO(penghuang): Switch to sk_surface_->flush() when skia flush bug is
diff --git a/gpu/command_buffer/service/skia_utils.cc b/gpu/command_buffer/service/skia_utils.cc
index 58dfb8e7..ec81f696 100644
--- a/gpu/command_buffer/service/skia_utils.cc
+++ b/gpu/command_buffer/service/skia_utils.cc
@@ -21,6 +21,23 @@
 
 namespace gpu {
 
+namespace {
+
+struct FlushCleanupContext {
+  std::vector<base::OnceClosure> cleanup_tasks;
+};
+
+void CleanupAfterSkiaFlush(void* context) {
+  FlushCleanupContext* flush_context =
+      static_cast<FlushCleanupContext*>(context);
+  for (auto& task : flush_context->cleanup_tasks) {
+    std::move(task).Run();
+  }
+  delete flush_context;
+}
+
+}  // namespace
+
 bool GetGrBackendTexture(const gl::GLVersionInfo* version_info,
                          GLenum target,
                          const gfx::Size& size,
@@ -43,17 +60,32 @@
   return true;
 }
 
-void CreateCleanupCallbackForSkiaFlush(
+void AddCleanupTaskForSkiaFlush(base::OnceClosure task,
+                                GrFlushInfo* flush_info) {
+  FlushCleanupContext* context;
+  if (!flush_info->fFinishedProc) {
+    DCHECK(!flush_info->fFinishedContext);
+    flush_info->fFinishedProc = &CleanupAfterSkiaFlush;
+    context = new FlushCleanupContext();
+    flush_info->fFinishedContext = context;
+  } else {
+    DCHECK_EQ(flush_info->fFinishedProc, &CleanupAfterSkiaFlush);
+    DCHECK(flush_info->fFinishedContext);
+    context = static_cast<FlushCleanupContext*>(flush_info->fFinishedContext);
+  }
+  context->cleanup_tasks.push_back(std::move(task));
+}
+
+void AddVulkanCleanupTaskForSkiaFlush(
     viz::VulkanContextProvider* context_provider,
     GrFlushInfo* flush_info) {
-  DCHECK(!flush_info->fFinishedProc);
-  DCHECK(!flush_info->fFinishedContext);
 #if BUILDFLAG(ENABLE_VULKAN)
   if (context_provider) {
-    context_provider->GetDeviceQueue()
-        ->GetFenceHelper()
-        ->EnqueueExternalCallback(&flush_info->fFinishedProc,
-                                  &flush_info->fFinishedContext);
+    auto task = context_provider->GetDeviceQueue()
+                    ->GetFenceHelper()
+                    ->CreateExternalCallback();
+    if (task)
+      AddCleanupTaskForSkiaFlush(std::move(task), flush_info);
   }
 #endif
 }
diff --git a/gpu/command_buffer/service/skia_utils.h b/gpu/command_buffer/service/skia_utils.h
index 5f47e70..3edf8b47 100644
--- a/gpu/command_buffer/service/skia_utils.h
+++ b/gpu/command_buffer/service/skia_utils.h
@@ -5,6 +5,7 @@
 #ifndef GPU_COMMAND_BUFFER_SERVICE_SKIA_UTILS_H_
 #define GPU_COMMAND_BUFFER_SERVICE_SKIA_UTILS_H_
 
+#include "base/callback_forward.h"
 #include "components/viz/common/resources/resource_format.h"
 #include "gpu/gpu_gles2_export.h"
 #include "third_party/skia/include/core/SkSurface.h"
@@ -39,9 +40,13 @@
                                           viz::ResourceFormat resource_format,
                                           GrBackendTexture* gr_texture);
 
+// Adds a task to be executed when the flush in |flush_info| is complete.
+GPU_GLES2_EXPORT void AddCleanupTaskForSkiaFlush(base::OnceClosure task,
+                                                 GrFlushInfo* flush_info);
+
 // Helper which associates cleanup callbacks with a Skia GrFlushInfo's callback.
 // Is a no-op if |context_provider| is null.
-GPU_GLES2_EXPORT void CreateCleanupCallbackForSkiaFlush(
+GPU_GLES2_EXPORT void AddVulkanCleanupTaskForSkiaFlush(
     viz::VulkanContextProvider* context_provider,
     GrFlushInfo* flush_info);
 
diff --git a/gpu/vulkan/vulkan_fence_helper.cc b/gpu/vulkan/vulkan_fence_helper.cc
index cf8f62e..c1c17cf6 100644
--- a/gpu/vulkan/vulkan_fence_helper.cc
+++ b/gpu/vulkan/vulkan_fence_helper.cc
@@ -142,40 +142,30 @@
   return EnqueueFence(fence);
 }
 
-void VulkanFenceHelper::EnqueueExternalCallback(
-    ExternalCallback* callback,
-    ExternalCallbackContext* context) {
+base::OnceClosure VulkanFenceHelper::CreateExternalCallback() {
   // No need to do callback tracking if there are no cleanup tasks to run.
   if (tasks_pending_fence_.empty())
-    return;
+    return base::OnceClosure();
 
-  // Get a generaiton ID for this callback and associate existing cleanup
+  // Get a generation ID for this callback and associate existing cleanup
   // tasks.
   uint64_t generation_id = next_generation_++;
   cleanup_tasks_.emplace_back(generation_id, std::move(tasks_pending_fence_));
   tasks_pending_fence_ = std::vector<CleanupTask>();
 
-  // Populate |callback| and |context|.
-  struct ExternalCallbackData {
-    base::WeakPtr<VulkanFenceHelper> fence_helper;
-    uint64_t generation_id;
-  };
-  // As we must pass a void* which may outlive this class, use "new" here. We
-  // will delete |context| in the callback below.
-  *context =
-      new ExternalCallbackData{weak_factory_.GetWeakPtr(), generation_id};
-  *callback = [](ExternalCallbackContext context) {
-    auto* callback_data = static_cast<ExternalCallbackData*>(context);
-    if (auto* fence_helper = callback_data->fence_helper.get()) {
-      // If |current_generation_| is ahead of the callback's |generation_id|,
-      // the callback came late. Ignore it.
-      if (callback_data->generation_id > fence_helper->current_generation_) {
-        fence_helper->current_generation_ = callback_data->generation_id;
-        fence_helper->ProcessCleanupTasks();
-      }
-    }
-    delete callback_data;
-  };
+  return base::BindOnce(
+      [](base::WeakPtr<VulkanFenceHelper> fence_helper,
+         uint64_t generation_id) {
+        if (!fence_helper)
+          return;
+        // If |current_generation_| is ahead of the callback's
+        // |generation_id|, the callback came late. Ignore it.
+        if (generation_id > fence_helper->current_generation_) {
+          fence_helper->current_generation_ = generation_id;
+          fence_helper->ProcessCleanupTasks();
+        }
+      },
+      weak_factory_.GetWeakPtr(), generation_id);
 }
 
 void VulkanFenceHelper::EnqueueSemaphoreCleanupForSubmittedWork(
diff --git a/gpu/vulkan/vulkan_fence_helper.h b/gpu/vulkan/vulkan_fence_helper.h
index feef902..4e006bb1 100644
--- a/gpu/vulkan/vulkan_fence_helper.h
+++ b/gpu/vulkan/vulkan_fence_helper.h
@@ -7,6 +7,7 @@
 
 #include <vulkan/vulkan.h>
 
+#include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/containers/circular_deque.h"
 #include "base/macros.h"
@@ -69,18 +70,14 @@
   // TODO(ericrk): We should avoid this in all cases if possible.
   FenceHandle GenerateCleanupFence();
 
-  // Helper for associating cleanup tasks with a callback which will be run
-  // after a future fence submission. Used in cases where an external
-  // component (Skia) is submitting / waiting on a fence and cannot share that
-  // fence with this class.
+  // Creates a callback that calls pending cleanup tasks. Used in cases where an
+  // external component (Skia) is submitting / waiting on a fence and cannot
+  // share that fence with this class.
   // Note: It is important that no new cleanup tasks or fences are inserted
   // between this call and the submission of the fence which will eventually
   // trigger this callback. Doing so could cause the callbacks associated
   // with this call to run out of order / incorrectly.
-  using ExternalCallbackContext = void*;
-  using ExternalCallback = void (*)(ExternalCallbackContext);
-  void EnqueueExternalCallback(ExternalCallback* callback,
-                               ExternalCallbackContext* context);
+  base::OnceClosure CreateExternalCallback();
 
   // Helper functions which allow clients to wait for or check the statusof a
   // fence submitted with EnqueueFence.
@@ -99,7 +96,8 @@
   using CleanupTask = base::OnceCallback<void(VulkanDeviceQueue* device_queue,
                                               bool device_lost)>;
   // Submits a cleanup task for already submitted work.  ProcessCleanupTasks
-  // must be called periodically to ensure these run.
+  // must be called periodically to ensure these run. Cleanup tasks will be
+  // executed in order they are enqueued.
   void EnqueueCleanupTaskForSubmittedWork(CleanupTask task);
   // Processes CleanupTasks for which a fence has passed.
   void ProcessCleanupTasks();
@@ -109,6 +107,9 @@
       std::vector<VkSemaphore> semaphores);
   void EnqueueImageCleanupForSubmittedWork(VkImage image,
                                            VkDeviceMemory memory);
+  // Helpers for VulkanCommandBuffer, VulkanCommandPool, etc
+  template <typename T>
+  void EnqueueVulkanObjectCleanupForSubmittedWork(std::unique_ptr<T> obj);
 
  private:
   void PerformImmediateCleanup();
@@ -142,6 +143,15 @@
   DISALLOW_COPY_AND_ASSIGN(VulkanFenceHelper);
 };
 
+template <typename T>
+void VulkanFenceHelper::EnqueueVulkanObjectCleanupForSubmittedWork(
+    std::unique_ptr<T> obj) {
+  EnqueueCleanupTaskForSubmittedWork(
+      base::BindOnce([](std::unique_ptr<T> obj, VulkanDeviceQueue* device_queue,
+                        bool device_lost) { obj->Destroy(); },
+                     std::move(obj)));
+}
+
 }  // namespace gpu
 
 #endif  // GPU_VULKAN_VULKAN_FENCE_HELPER_H_
diff --git a/gpu/vulkan/vulkan_fence_helper_unittest.cc b/gpu/vulkan/vulkan_fence_helper_unittest.cc
index 9efcca1..8e3d9d1 100644
--- a/gpu/vulkan/vulkan_fence_helper_unittest.cc
+++ b/gpu/vulkan/vulkan_fence_helper_unittest.cc
@@ -101,11 +101,9 @@
       base::BindOnce([](bool* cleanup_run, VulkanDeviceQueue* device_queue,
                         bool is_lost) { *cleanup_run = true; },
                      &cleanup_run));
-  VulkanFenceHelper::ExternalCallback callback;
-  VulkanFenceHelper::ExternalCallbackContext context;
-  fence_helper->EnqueueExternalCallback(&callback, &context);
+  auto cleanup_closure = fence_helper->CreateExternalCallback();
   EXPECT_FALSE(cleanup_run);
-  callback(context);
+  std::move(cleanup_closure).Run();
   EXPECT_TRUE(cleanup_run);
 }
 
@@ -126,9 +124,7 @@
   }
 
   // The first 5 callbacks use a callback to trigger.
-  VulkanFenceHelper::ExternalCallback callback;
-  VulkanFenceHelper::ExternalCallbackContext context;
-  fence_helper->EnqueueExternalCallback(&callback, &context);
+  auto cleanup_closure = fence_helper->CreateExternalCallback();
 
   // Enqueue 5 more callbacks.
   for (int i = 5; i < 10; i++) {
@@ -147,7 +143,7 @@
   EXPECT_EQ(10u, cleanups_run);
 
   // Running the callback now should be a no-op.
-  callback(context);
+  std::move(cleanup_closure).Run();
   EXPECT_EQ(10u, cleanups_run);
 }
 
@@ -179,13 +175,11 @@
   }
 
   // The next 5 callbacks use a callback to trigger.
-  VulkanFenceHelper::ExternalCallback callback;
-  VulkanFenceHelper::ExternalCallbackContext context;
-  fence_helper->EnqueueExternalCallback(&callback, &context);
+  auto cleanup_closure = fence_helper->CreateExternalCallback();
 
-  // Signal the fence, all callbacks should run.
+  // Call the cleanup closure, all callbacks should run.
   // Generate a cleanup fence for the next 5 callbacks.
-  callback(context);
+  std::move(cleanup_closure).Run();
   EXPECT_EQ(10u, cleanups_run);
 }
 
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 007b9a1b..9683f34 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1898,6 +1898,30 @@
       <message name="IDS_IOS_TRANSLATE_INFOBAR_TRANSLATING_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement read by Voice Over when the Translate Infobar UI is shown in translating mode. [Length: unlimited] [iOS only]">
         Translating the page to <ph name="language">$1<ex>French</ex></ph>. Options available near bottom of the screen.
       </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TITLE" desc="Title for the language settings menu entry and page. [Length: 25em] [iOS only]">
+        Languages
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_TITLE" desc="Title for the add language page of language settings. [Length: 25em] [iOS only]">
+        Add Language
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_HEADER" desc="Header for the fluent languages section in the language settings page. [Length: unlimited] [iOS only]">
+        Websites will show text in your preferred language, when possible.
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_ADD_LANGUAGE_BUTTON_TITLE" desc="Title for the button to add a language to the list of fluent languages in the language settings page. [Length: 30em] [iOS only]">
+        Add Language...
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_TITLE" desc="Title for the switch to enable or disable translation in the language settings page. [Length: 30em] [iOS only]" meaning="Turning this switch on enables offering translation and turning it off disables offering translation.">
+        Translate Pages
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_TRANSLATE_SWITCH_SUBTITLE" desc="Subtitle for the switch to enable or disable translation in the language settings page. [Length: unlimited] [iOS only]" meaning="This switch controls offering translation for pages in languages other than the languages listed above.">
+        Offer to translate pages in other languages
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_NEVER_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is not offered. [Length: 25em] [iOS only]">
+        Never Translate
+      </message>
+      <message name="IDS_IOS_LANGUAGE_SETTINGS_OFFER_TO_TRANSLATE_TITLE" desc="Label shown next to a language for which translation is offered. [Length: 25em] [iOS only]">
+        Offer to Translate
+      </message>
       <message name="IDS_IOS_TRANSLATE_SETTING" desc="Title for the view and option in Settings for Translate. [Length: 25em] [iOS only]">
         Google Translate
       </message>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index e8a1848..eee58f5 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -580,6 +580,9 @@
      flag_descriptions::kAutofillPruneSuggestionsName,
      flag_descriptions::kAutofillPruneSuggestionsDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(autofill::features::kAutofillPruneSuggestions)},
+    {"language-settings", flag_descriptions::kLanguageSettingsName,
+     flag_descriptions::kLanguageSettingsDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kLanguageSettings)},
 };
 
 // Add all switches from experimental flags to |command_line|.
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 93480f9..774cbdfa 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -289,6 +289,11 @@
     "an individual promotion causes that promotion but no other promotions to "
     "occur.";
 
+const char kLanguageSettingsName[] = "Language Settings";
+const char kLanguageSettingsDescription[] =
+    "Enables the Language Settings page allowing modifications to user "
+    "preferred languages and translate preferences.";
+
 const char kMarkHttpAsName[] = "Mark non-secure origins as non-secure";
 const char kMarkHttpAsDescription[] = "Change the UI treatment for HTTP pages";
 
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index 83789782..32a07345 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -236,6 +236,10 @@
 extern const char kInProductHelpDemoModeName[];
 extern const char kInProductHelpDemoModeDescription[];
 
+// Title and description for the flag to enable the language settings page.
+extern const char kLanguageSettingsName[];
+extern const char kLanguageSettingsDescription[];
+
 // Title, description, and options for the MarkHttpAs setting that controls
 // display of omnibox warnings about non-secure pages.
 extern const char kMarkHttpAsName[];
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn
index ba1eab1..bbf832c 100644
--- a/ios/chrome/browser/translate/BUILD.gn
+++ b/ios/chrome/browser/translate/BUILD.gn
@@ -32,8 +32,8 @@
     "translate_ranker_factory.h",
     "translate_ranker_metrics_provider.cc",
     "translate_ranker_metrics_provider.h",
-    "translate_service_ios.cc",
     "translate_service_ios.h",
+    "translate_service_ios.mm",
   ]
   deps = [
     "//base",
diff --git a/ios/chrome/browser/translate/translate_service_ios.h b/ios/chrome/browser/translate/translate_service_ios.h
index 840ffe6..4bbc3a7f 100644
--- a/ios/chrome/browser/translate/translate_service_ios.h
+++ b/ios/chrome/browser/translate/translate_service_ios.h
@@ -9,6 +9,11 @@
 #include "components/web_resource/resource_request_allowed_notifier.h"
 
 class GURL;
+class PrefService;
+
+namespace language {
+class LanguageModel;
+}  // namespace language
 
 // Singleton managing the resources required for Translate.
 class TranslateServiceIOS
@@ -20,6 +25,11 @@
   // Must be called to shut down the Translate feature.
   static void Shutdown();
 
+  // Returns the language to translate to. For more details, see
+  // TranslateManager::GetTargetLanguage.
+  static std::string GetTargetLanguage(PrefService* prefs,
+                                       language::LanguageModel* language_model);
+
   // Returns true if the URL can be translated.
   static bool IsTranslatableURL(const GURL& url);
 
diff --git a/ios/chrome/browser/translate/translate_service_ios.cc b/ios/chrome/browser/translate/translate_service_ios.mm
similarity index 79%
rename from ios/chrome/browser/translate/translate_service_ios.cc
rename to ios/chrome/browser/translate/translate_service_ios.mm
index 34e7730..7faef36 100644
--- a/ios/chrome/browser/translate/translate_service_ios.cc
+++ b/ios/chrome/browser/translate/translate_service_ios.mm
@@ -6,12 +6,19 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "components/language/core/browser/language_model.h"
+#include "components/prefs/pref_service.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_manager.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
+#include "ios/chrome/browser/translate/chrome_ios_translate_client.h"
 #include "url/gurl.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 // The singleton instance of TranslateServiceIOS.
 TranslateServiceIOS* g_translate_service = nullptr;
@@ -26,8 +33,7 @@
   resource_request_allowed_notifier_.Init(this, true /* leaky */);
 }
 
-TranslateServiceIOS::~TranslateServiceIOS() {
-}
+TranslateServiceIOS::~TranslateServiceIOS() {}
 
 // static
 void TranslateServiceIOS::Initialize() {
@@ -65,6 +71,15 @@
 }
 
 // static
+std::string TranslateServiceIOS::GetTargetLanguage(
+    PrefService* prefs,
+    language::LanguageModel* language_model) {
+  return translate::TranslateManager::GetTargetLanguage(
+      ChromeIOSTranslateClient::CreateTranslatePrefs(prefs).get(),
+      language_model);
+}
+
+// static
 bool TranslateServiceIOS::IsTranslatableURL(const GURL& url) {
   // A URL is translatable unless it is one of the following:
   // - empty (can happen for popups created with window.open(""))
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm
index 2c4d01d..cf00235 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm
@@ -212,7 +212,13 @@
     for (auto& observer : observers_) {
       observer.FullscreenModelScrollEventStarted(this);
     }
+    // Update the base offset for each new scroll event.
     UpdateBaseOffset();
+    // Re-rendering events are ignored during scrolls since disabling the model
+    // mid-scroll leads to choppy animations.  If the content was re-rendered
+    // to be too short to collapse the toolbars, the model should be disabled
+    // to prevent the subsequent scroll.
+    UpdateDisabledCounterForContentHeight();
   }
 }
 
@@ -289,6 +295,12 @@
 }
 
 void FullscreenModel::UpdateDisabledCounterForContentHeight() {
+  // Sometimes the content size and scroll view sizes are updated mid-scroll
+  // such that the scroll view height is updated before the content is re-
+  // rendered, causing the model to be disabled.  These changes should be
+  // ignored while the content is scrolling.
+  if (scrolling_)
+    return;
   // The model should be disabled when the content fits.
   CGFloat disabling_threshold = scroll_view_height_;
   if (resizes_scroll_view_) {
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm
index 70debaa..0730f73 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm
@@ -276,3 +276,20 @@
   SimulateFullscreenUserScrollForProgress(&model(), 0.0);
   EXPECT_EQ(observer().progress(), 1.0);
 }
+
+// Tests that updates to the content height that would normally disable the
+// model are ignored during the scroll, and that the model is correctly updated
+// to be disabled upon the subsequent scroll.
+TEST_F(FullscreenModelTest, IgnoreContentHeightChangesWhileScrolling) {
+  ASSERT_TRUE(model().enabled());
+  // Simulate a re-render to a height that would disable the model during a
+  // scroll.
+  model().SetScrollViewIsScrolling(true);
+  model().SetContentHeight(kScrollViewHeight / 2.0);
+  model().SetScrollViewIsScrolling(false);
+  EXPECT_TRUE(model().enabled());
+  // Simulate the start of a subsequent scroll and verify that the model becomes
+  // disabled for the short content height.
+  model().SetScrollViewIsDragging(true);
+  EXPECT_FALSE(model().enabled());
+}
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h
index 4f57c5c..8e520b0 100644
--- a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h
+++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h
@@ -7,8 +7,11 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
+
 // View controller to related to AdvancedSigninSettingsCoordinator.
-@interface AdvancedSigninSettingsNavigationController : UINavigationController
+@interface AdvancedSigninSettingsNavigationController
+    : SettingsNavigationController
 
 @end
 
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
index 6beeb532..3a4ef41 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.mm
@@ -20,6 +20,7 @@
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.h"
+#import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h"
 #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 
@@ -191,8 +192,11 @@
 }
 
 - (void)openPassphraseDialog {
-  [self.dispatcher
-      showSyncPassphraseSettingsFromViewController:self.viewController];
+  SyncEncryptionPassphraseTableViewController* controller =
+      [[SyncEncryptionPassphraseTableViewController alloc]
+          initWithBrowserState:self.browserState];
+  controller.dispatcher = self.dispatcher;
+  [self.navigationController pushViewController:controller animated:YES];
 }
 
 - (void)showSignIn {
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index 181e80e6..b99b35c 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -34,3 +34,6 @@
 
 const base::Feature kOmniboxUseDefaultSearchEngineFavicon{
     "OmniboxUseDefaultSearchEngineFavicon", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kLanguageSettings{"LanguageSettings",
+                                      base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h
index 5842439..eb8c72a 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.h
+++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -40,4 +40,7 @@
 // in the omnibox.
 extern const base::Feature kOmniboxUseDefaultSearchEngineFavicon;
 
+// Feature flag for the language settings page.
+extern const base::Feature kLanguageSettings;
+
 #endif  // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/browser/web_state_list/web_state_list.mm b/ios/chrome/browser/web_state_list/web_state_list.mm
index 72a27e1..a8160c97 100644
--- a/ios/chrome/browser/web_state_list/web_state_list.mm
+++ b/ios/chrome/browser/web_state_list/web_state_list.mm
@@ -289,10 +289,17 @@
   // as the active one but only send the WebStateActivatedAt notification after
   // the WebStateDetachedAt one.
   bool active_web_state_was_closed = (index == active_index_);
-  if (active_index_ > index)
+  if (active_index_ > index) {
     --active_index_;
-  else if (active_index_ == index)
-    active_index_ = new_active_index;
+  } else if (active_index_ == index) {
+    if (new_active_index != kInvalidIndex && !ContainsIndex(new_active_index)) {
+      // TODO(crbug.com/877792): This is a speculative fix for 877792 and short
+      // term fix for 960628.
+      active_index_ = count() - 1;
+    } else {
+      active_index_ = new_active_index;
+    }
+  }
 
   for (auto& observer : observers_)
     observer.WebStateDetachedAt(this, web_state, index);
diff --git a/ios/chrome/browser/web_state_list/web_state_list_unittest.mm b/ios/chrome/browser/web_state_list/web_state_list_unittest.mm
index c7fb005..0c6fd11 100644
--- a/ios/chrome/browser/web_state_list/web_state_list_unittest.mm
+++ b/ios/chrome/browser/web_state_list/web_state_list_unittest.mm
@@ -568,6 +568,25 @@
                 nullptr, WebStateList::kInvalidIndex, true));
 }
 
+// Test detaching a webstate which has an invalid opener.  This is a regression
+// test for https://crbug.com/960628.
+TEST_F(WebStateListTest, DetachWebStateWithInvalidOpener) {
+  AppendNewWebState(kURL0);
+  AppendNewWebState(kURL1);
+  // Sanity check before closing WebState.
+  ASSERT_EQ(2, web_state_list_.count());
+  EXPECT_EQ(kURL0, web_state_list_.GetWebStateAt(0)->GetVisibleURL().spec());
+  EXPECT_EQ(kURL1, web_state_list_.GetWebStateAt(1)->GetVisibleURL().spec());
+  web_state_list_.ActivateWebStateAt(1);
+  // Update a WebState to have an invalid opener.
+  web_state_list_.SetOpenerOfWebStateAt(
+      1, WebStateOpener(web_state_list_.GetWebStateAt(1)));
+  // After detaching, the active index should be valid.
+  web_state_list_.DetachWebStateAt(1);
+  EXPECT_EQ(1, web_state_list_.count());
+  EXPECT_TRUE(web_state_list_.ContainsIndex(web_state_list_.active_index()));
+}
+
 // Test finding opended-by indexes when no webstates have been opened.
 TEST_F(WebStateListTest, OpenersNothingOpened) {
   AppendNewWebState(kURL0);
diff --git a/ios/web/browser_state.mm b/ios/web/browser_state.mm
index 55d9a762..9d0806d5 100644
--- a/ios/web/browser_state.mm
+++ b/ios/web/browser_state.mm
@@ -24,6 +24,7 @@
 #include "ios/web/public/web_thread.h"
 #include "ios/web/webui/url_data_manager_ios_backend.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_context_getter_observer.h"
 #include "services/network/network_context.h"
@@ -299,20 +300,20 @@
     // Have the global service manager connection start an instance of the
     // web_browser service that is associated with this BrowserState (via
     // |new_group|).
-    service_manager::mojom::ServicePtr service;
-    auto service_request = mojo::MakeRequest(&service);
+    mojo::PendingRemote<service_manager::mojom::Service> service;
+    auto service_receiver = service.InitWithNewPipeAndPassReceiver();
 
-    service_manager::mojom::PIDReceiverPtr pid_receiver;
+    mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
     service_manager::Identity identity(mojom::kBrowserServiceName, new_group,
                                        base::Token{},
                                        base::Token::CreateRandom());
     service_manager_connection->GetConnector()->RegisterServiceInstance(
-        identity, std::move(service), mojo::MakeRequest(&pid_receiver));
-    pid_receiver->SetPID(base::GetCurrentProcId());
+        identity, std::move(service), metadata.BindNewPipeAndPassReceiver());
+    metadata->SetPID(base::GetCurrentProcId());
 
     auto connection_holder =
         std::make_unique<BrowserStateServiceManagerConnectionHolder>(
-            browser_state, std::move(service_request));
+            browser_state, std::move(service_receiver));
 
     ServiceManagerConnection* connection =
         connection_holder->service_manager_connection();
diff --git a/ios/web/service_manager_connection_impl_unittest.cc b/ios/web/service_manager_connection_impl_unittest.cc
index 3711a1f3..7c913a5d 100644
--- a/ios/web/service_manager_connection_impl_unittest.cc
+++ b/ios/web/service_manager_connection_impl_unittest.cc
@@ -11,10 +11,10 @@
 #include "ios/web/public/test/test_web_thread_bundle.h"
 #include "ios/web/public/web_task_traits.h"
 #include "ios/web/public/web_thread.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
@@ -43,20 +43,14 @@
         run_loop.Quit();
       }));
   connection.Start();
-  service_manager::BindSourceInfo source_info(
-      service_manager::Identity{service_manager::mojom::kServiceName,
-                                service_manager::kSystemInstanceGroup,
-                                base::Token{}, base::Token::CreateRandom()},
-      service_manager::CapabilitySet());
-  service_manager::mojom::ServiceFactoryPtr factory;
-  service->OnBindInterface(
-      source_info, service_manager::mojom::ServiceFactory::Name_,
-      mojo::MakeRequest(&factory).PassMessagePipe(), base::DoNothing());
-  service_manager::mojom::ServicePtr created_service;
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
-  mojo::MakeRequest(&pid_receiver);
-  factory->CreateService(mojo::MakeRequest(&created_service), kTestServiceName,
-                         std::move(pid_receiver));
+
+  mojo::PendingRemote<service_manager::mojom::Service> packaged_service;
+  mojo::PendingRemote<service_manager::mojom::ProcessMetadata> metadata;
+  ignore_result(metadata.InitWithNewPipeAndPassReceiver());
+  service->CreatePackagedServiceInstance(
+      service_manager::Identity(kTestServiceName, base::Token::CreateRandom(),
+                                base::Token(), base::Token::CreateRandom()),
+      packaged_service.InitWithNewPipeAndPassReceiver(), std::move(metadata));
   run_loop.Run();
 }
 
diff --git a/ios/web/service_manager_context.mm b/ios/web/service_manager_context.mm
index 9bf9af8..bfbdfc95 100644
--- a/ios/web/service_manager_context.mm
+++ b/ios/web/service_manager_context.mm
@@ -25,6 +25,7 @@
 #include "ios/web/service_manager_connection_impl.h"
 #import "ios/web/web_browser_manifest.h"
 #import "ios/web/web_packaged_services_manifest.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/manifest.h"
@@ -84,13 +85,11 @@
     service_manager_ =
         std::make_unique<service_manager::ServiceManager>(nullptr, manifests);
 
-    service_manager::mojom::ServicePtr packaged_services_service;
-    packaged_services_service.Bind(std::move(packaged_services_service_info));
     service_manager_->RegisterService(
         service_manager::Identity(mojom::kPackagedServicesServiceName,
                                   service_manager::kSystemInstanceGroup,
                                   base::Token{}, base::Token::CreateRandom()),
-        std::move(packaged_services_service), nullptr);
+        std::move(packaged_services_service_info), mojo::NullReceiver());
   }
 
   void ShutDownOnIOThread() {
@@ -120,19 +119,19 @@
       base::BindRepeating(&ServiceManagerContext::OnUnhandledServiceRequest,
                           weak_ptr_factory_.GetWeakPtr()));
 
-  service_manager::mojom::ServicePtr root_browser_service;
+  service_manager::mojom::ServicePtrInfo root_browser_service;
   ServiceManagerConnection::Set(ServiceManagerConnection::Create(
       mojo::MakeRequest(&root_browser_service),
       base::CreateSingleThreadTaskRunnerWithTraits({WebThread::IO})));
   auto* browser_connection = ServiceManagerConnection::Get();
 
-  service_manager::mojom::PIDReceiverPtr pid_receiver;
+  mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
   packaged_services_connection_->GetConnector()->RegisterServiceInstance(
       service_manager::Identity(mojom::kBrowserServiceName,
                                 service_manager::kSystemInstanceGroup,
                                 base::Token{}, base::Token::CreateRandom()),
-      std::move(root_browser_service), mojo::MakeRequest(&pid_receiver));
-  pid_receiver->SetPID(base::GetCurrentProcId());
+      std::move(root_browser_service), metadata.BindNewPipeAndPassReceiver());
+  metadata->SetPID(base::GetCurrentProcId());
 
   packaged_services_connection_->Start();
   browser_connection->Start();
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 3ea32e5..156c80c 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -29,6 +29,7 @@
 #include "ios/web/public/favicon_url.h"
 #import "ios/web/public/java_script_dialog_presenter.h"
 #import "ios/web/public/navigation_item.h"
+#import "ios/web/public/serializable_user_data_manager.h"
 #import "ios/web/public/web_client.h"
 #import "ios/web/public/web_state/context_menu_params.h"
 #import "ios/web/public/web_state/ui/crw_native_content.h"
@@ -625,8 +626,16 @@
 CRWSessionStorage* WebStateImpl::BuildSessionStorage() {
   [web_controller_ recordStateInHistory];
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-      restored_session_storage_)
+      restored_session_storage_) {
+    // UserData can be updated in an uncommitted WebState. Even
+    // if a WebState hasn't been restored, its opener value may have changed.
+    std::unique_ptr<web::SerializableUserData> serializable_user_data =
+        web::SerializableUserDataManager::FromWebState(this)
+            ->CreateSerializableUserData();
+    [restored_session_storage_
+        setSerializableUserData:std::move(serializable_user_data)];
     return restored_session_storage_;
+  }
   SessionStorageBuilder session_storage_builder;
   return session_storage_builder.BuildStorage(this);
 }
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm
index c80075d..b6aef0a 100644
--- a/ios/web/web_state/web_state_impl_unittest.mm
+++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -13,6 +13,7 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/mac/foundation_util.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "base/test/scoped_feature_list.h"
@@ -20,10 +21,12 @@
 #import "ios/web/interstitials/web_interstitial_impl.h"
 #import "ios/web/navigation/navigation_context_impl.h"
 #import "ios/web/navigation/navigation_item_impl.h"
+#import "ios/web/navigation/serializable_user_data_manager_impl.h"
 #import "ios/web/navigation/wk_navigation_util.h"
 #import "ios/web/public/crw_navigation_item_storage.h"
 #import "ios/web/public/crw_session_storage.h"
 #import "ios/web/public/java_script_dialog_presenter.h"
+#import "ios/web/public/serializable_user_data_manager.h"
 #import "ios/web/public/test/fakes/fake_navigation_context.h"
 #import "ios/web/public/test/fakes/fake_web_frame.h"
 #include "ios/web/public/test/fakes/test_browser_state.h"
@@ -911,7 +914,8 @@
 }
 
 // Tests that BuildSessionStorage() and GetTitle() return information about the
-// most recently restored session if no navigation item has been committed.
+// most recently restored session if no navigation item has been committed. Also
+// tests that re-restoring that session includes updated userData.
 TEST_P(WebStateImplTest, UncommittedRestoreSession) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
@@ -929,12 +933,25 @@
   web::WebState::CreateParams params(GetBrowserState());
   WebStateImpl web_state(params, session_storage);
 
+  // After restoring |web_state| change the uncommitted state's user data.
+  web::SerializableUserDataManager* user_data_manager =
+      web::SerializableUserDataManager::FromWebState(&web_state);
+  user_data_manager->AddSerializableData(@(1), @"user_data_key");
+
   CRWSessionStorage* extracted_session_storage =
       web_state.BuildSessionStorage();
   EXPECT_EQ(0, extracted_session_storage.lastCommittedItemIndex);
   EXPECT_EQ(1U, extracted_session_storage.itemStorages.count);
   EXPECT_NSEQ(@"Title", base::SysUTF16ToNSString(web_state.GetTitle()));
   EXPECT_EQ(url, web_state.GetVisibleURL());
+
+  WebStateImpl restored_web_state(params, extracted_session_storage);
+  web::SerializableUserDataManager* restored_user_data_manager =
+      web::SerializableUserDataManager::FromWebState(&restored_web_state);
+  NSNumber* user_data_value = base::mac::ObjCCast<NSNumber>(
+      restored_user_data_manager->GetValueForSerializationKey(
+          @"user_data_key"));
+  EXPECT_EQ(@(1), user_data_value);
 }
 
 TEST_P(WebStateImplTest, NoUncommittedRestoreSession) {
diff --git a/media/gpu/v4l2/v4l2_vp9_accelerator.cc b/media/gpu/v4l2/v4l2_vp9_accelerator.cc
index 32e14f8..00aa0a7 100644
--- a/media/gpu/v4l2/v4l2_vp9_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_vp9_accelerator.cc
@@ -160,8 +160,8 @@
 
 class V4L2VP9Picture : public VP9Picture {
  public:
-  explicit V4L2VP9Picture(const scoped_refptr<V4L2DecodeSurface>& dec_surface)
-      : dec_surface_(dec_surface) {}
+  explicit V4L2VP9Picture(scoped_refptr<V4L2DecodeSurface> dec_surface)
+      : dec_surface_(std::move(dec_surface)) {}
 
   V4L2VP9Picture* AsV4L2VP9Picture() override { return this; }
   scoped_refptr<V4L2DecodeSurface> dec_surface() { return dec_surface_; }
@@ -202,10 +202,10 @@
   if (!dec_surface)
     return nullptr;
 
-  return new V4L2VP9Picture(dec_surface);
+  return new V4L2VP9Picture(std::move(dec_surface));
 }
 
-bool V4L2VP9Accelerator::SubmitDecode(const scoped_refptr<VP9Picture>& pic,
+bool V4L2VP9Accelerator::SubmitDecode(scoped_refptr<VP9Picture> pic,
                                       const Vp9SegmentationParams& segm_params,
                                       const Vp9LoopFilterParams& lf_params,
                                       const Vp9ReferenceFrameVector& ref_frames,
@@ -280,7 +280,7 @@
     auto ref_pic = ref_frames.GetFrame(i);
     if (ref_pic) {
       scoped_refptr<V4L2DecodeSurface> ref_surface =
-          VP9PictureToV4L2DecodeSurface(ref_pic);
+          VP9PictureToV4L2DecodeSurface(ref_pic.get());
 
       v4l2_decode_param.ref_frames[i] = ref_surface->GetReferenceID();
       ref_surfaces.push_back(ref_surface);
@@ -304,7 +304,7 @@
     scoped_refptr<VP9Picture> ref_pic = ref_frames.GetFrame(idx);
     if (ref_pic) {
       scoped_refptr<V4L2DecodeSurface> ref_surface =
-          VP9PictureToV4L2DecodeSurface(ref_pic);
+          VP9PictureToV4L2DecodeSurface(ref_pic.get());
       v4l2_ref_frame->buf_index = ref_surface->GetReferenceID();
 #define REF_TO_V4L2_REF(a) v4l2_ref_frame->a = ref_pic->frame_hdr->a
       REF_TO_V4L2_REF(frame_width);
@@ -344,7 +344,7 @@
   }
 
   scoped_refptr<V4L2DecodeSurface> dec_surface =
-      VP9PictureToV4L2DecodeSurface(pic);
+      VP9PictureToV4L2DecodeSurface(pic.get());
 
   struct v4l2_ext_controls ext_ctrls;
   memset(&ext_ctrls, 0, sizeof(ext_ctrls));
@@ -368,15 +368,15 @@
   return true;
 }
 
-bool V4L2VP9Accelerator::OutputPicture(const scoped_refptr<VP9Picture>& pic) {
+bool V4L2VP9Accelerator::OutputPicture(scoped_refptr<VP9Picture> pic) {
   // TODO(crbug.com/647725): Insert correct color space.
-  surface_handler_->SurfaceReady(VP9PictureToV4L2DecodeSurface(pic),
+  surface_handler_->SurfaceReady(VP9PictureToV4L2DecodeSurface(pic.get()),
                                  pic->bitstream_id(), pic->visible_rect(),
                                  VideoColorSpace());
   return true;
 }
 
-bool V4L2VP9Accelerator::GetFrameContext(const scoped_refptr<VP9Picture>& pic,
+bool V4L2VP9Accelerator::GetFrameContext(scoped_refptr<VP9Picture> pic,
                                          Vp9FrameContext* frame_ctx) {
   struct v4l2_ctrl_vp9_entropy v4l2_entropy;
   memset(&v4l2_entropy, 0, sizeof(v4l2_entropy));
@@ -388,7 +388,7 @@
   ctrl.p_vp9_entropy = &v4l2_entropy;
 
   scoped_refptr<V4L2DecodeSurface> dec_surface =
-      VP9PictureToV4L2DecodeSurface(pic);
+      VP9PictureToV4L2DecodeSurface(pic.get());
 
   struct v4l2_ext_controls ext_ctrls;
   memset(&ext_ctrls, 0, sizeof(ext_ctrls));
@@ -409,8 +409,7 @@
 }
 
 scoped_refptr<V4L2DecodeSurface>
-V4L2VP9Accelerator::VP9PictureToV4L2DecodeSurface(
-    const scoped_refptr<VP9Picture>& pic) {
+V4L2VP9Accelerator::VP9PictureToV4L2DecodeSurface(VP9Picture* pic) {
   V4L2VP9Picture* v4l2_pic = pic->AsV4L2VP9Picture();
   CHECK(v4l2_pic);
   return v4l2_pic->dec_surface();
diff --git a/media/gpu/v4l2/v4l2_vp9_accelerator.h b/media/gpu/v4l2/v4l2_vp9_accelerator.h
index 31f1dc1e..a85265c 100644
--- a/media/gpu/v4l2/v4l2_vp9_accelerator.h
+++ b/media/gpu/v4l2/v4l2_vp9_accelerator.h
@@ -28,22 +28,22 @@
   // VP9Decoder::VP9Accelerator implementation.
   scoped_refptr<VP9Picture> CreateVP9Picture() override;
 
-  bool SubmitDecode(const scoped_refptr<VP9Picture>& pic,
+  bool SubmitDecode(scoped_refptr<VP9Picture> pic,
                     const Vp9SegmentationParams& segm_params,
                     const Vp9LoopFilterParams& lf_params,
                     const Vp9ReferenceFrameVector& reference_frames,
                     const base::Closure& done_cb) override;
 
-  bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override;
+  bool OutputPicture(scoped_refptr<VP9Picture> pic) override;
 
-  bool GetFrameContext(const scoped_refptr<VP9Picture>& pic,
+  bool GetFrameContext(scoped_refptr<VP9Picture> pic,
                        Vp9FrameContext* frame_ctx) override;
 
   bool IsFrameContextRequired() const override;
 
  private:
   scoped_refptr<V4L2DecodeSurface> VP9PictureToV4L2DecodeSurface(
-      const scoped_refptr<VP9Picture>& pic);
+      VP9Picture* pic);
 
   bool device_needs_frame_context_;
 
diff --git a/media/gpu/vaapi/vaapi_vp9_accelerator.cc b/media/gpu/vaapi/vaapi_vp9_accelerator.cc
index 04932211..8ab85af 100644
--- a/media/gpu/vaapi/vaapi_vp9_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_vp9_accelerator.cc
@@ -39,7 +39,7 @@
 }
 
 bool VaapiVP9Accelerator::SubmitDecode(
-    const scoped_refptr<VP9Picture>& pic,
+    scoped_refptr<VP9Picture> pic,
     const Vp9SegmentationParams& seg,
     const Vp9LoopFilterParams& lf,
     const Vp9ReferenceFrameVector& ref_frames,
@@ -158,7 +158,7 @@
       pic->AsVaapiVP9Picture()->va_surface()->id());
 }
 
-bool VaapiVP9Accelerator::OutputPicture(const scoped_refptr<VP9Picture>& pic) {
+bool VaapiVP9Accelerator::OutputPicture(scoped_refptr<VP9Picture> pic) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const VaapiVP9Picture* vaapi_pic = pic->AsVaapiVP9Picture();
@@ -172,7 +172,7 @@
   return false;
 }
 
-bool VaapiVP9Accelerator::GetFrameContext(const scoped_refptr<VP9Picture>& pic,
+bool VaapiVP9Accelerator::GetFrameContext(scoped_refptr<VP9Picture> pic,
                                           Vp9FrameContext* frame_ctx) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   NOTIMPLEMENTED() << "Frame context update not supported";
diff --git a/media/gpu/vaapi/vaapi_vp9_accelerator.h b/media/gpu/vaapi/vaapi_vp9_accelerator.h
index 7fc9969c..b7e553cb 100644
--- a/media/gpu/vaapi/vaapi_vp9_accelerator.h
+++ b/media/gpu/vaapi/vaapi_vp9_accelerator.h
@@ -24,15 +24,15 @@
 
   // VP9Decoder::VP9Accelerator implementation.
   scoped_refptr<VP9Picture> CreateVP9Picture() override;
-  bool SubmitDecode(const scoped_refptr<VP9Picture>& pic,
+  bool SubmitDecode(scoped_refptr<VP9Picture> pic,
                     const Vp9SegmentationParams& seg,
                     const Vp9LoopFilterParams& lf,
                     const Vp9ReferenceFrameVector& reference_frames,
                     const base::Closure& done_cb) override;
 
-  bool OutputPicture(const scoped_refptr<VP9Picture>& pic) override;
+  bool OutputPicture(scoped_refptr<VP9Picture> pic) override;
   bool IsFrameContextRequired() const override;
-  bool GetFrameContext(const scoped_refptr<VP9Picture>& pic,
+  bool GetFrameContext(scoped_refptr<VP9Picture> pic,
                        Vp9FrameContext* frame_ctx) override;
 
  private:
diff --git a/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc
index d0cf58a..f5ecfbbd 100644
--- a/media/gpu/vp9_decoder.cc
+++ b/media/gpu/vp9_decoder.cc
@@ -204,13 +204,13 @@
 }
 
 void VP9Decoder::UpdateFrameContext(
-    const scoped_refptr<VP9Picture>& pic,
+    scoped_refptr<VP9Picture> pic,
     const base::Callback<void(const Vp9FrameContext&)>& context_refresh_cb) {
   DCHECK(context_refresh_cb);
   Vp9FrameContext frame_ctx;
   memset(&frame_ctx, 0, sizeof(frame_ctx));
 
-  if (!accelerator_->GetFrameContext(pic, &frame_ctx)) {
+  if (!accelerator_->GetFrameContext(std::move(pic), &frame_ctx)) {
     SetError();
     return;
   }
@@ -239,7 +239,7 @@
       return false;
   }
 
-  ref_frames_.Refresh(pic);
+  ref_frames_.Refresh(std::move(pic));
   return true;
 }
 
diff --git a/media/gpu/vp9_decoder.h b/media/gpu/vp9_decoder.h
index 50cd8f7ab..81b49881 100644
--- a/media/gpu/vp9_decoder.h
+++ b/media/gpu/vp9_decoder.h
@@ -60,7 +60,7 @@
     // |lf_params| does not need to remain valid after this method returns.
     //
     // Return true when successful, false otherwise.
-    virtual bool SubmitDecode(const scoped_refptr<VP9Picture>& pic,
+    virtual bool SubmitDecode(scoped_refptr<VP9Picture> pic,
                               const Vp9SegmentationParams& segm_params,
                               const Vp9LoopFilterParams& lf_params,
                               const Vp9ReferenceFrameVector& reference_frames,
@@ -76,7 +76,7 @@
     // immediately after calling this method.
     //
     // Return true when successful, false otherwise.
-    virtual bool OutputPicture(const scoped_refptr<VP9Picture>& pic) = 0;
+    virtual bool OutputPicture(scoped_refptr<VP9Picture> pic) = 0;
 
     // Return true if the accelerator requires the client to provide frame
     // context in order to decode. If so, the Vp9FrameHeader provided by the
@@ -85,7 +85,7 @@
 
     // Set |frame_ctx| to the state after decoding |pic|, returning true on
     // success, false otherwise.
-    virtual bool GetFrameContext(const scoped_refptr<VP9Picture>& pic,
+    virtual bool GetFrameContext(scoped_refptr<VP9Picture> pic,
                                  Vp9FrameContext* frame_ctx) = 0;
 
    private:
@@ -110,9 +110,6 @@
   size_t GetNumReferenceFrames() const override;
 
  private:
-  // Update ref_frames_ based on the information in current frame header.
-  void RefreshReferenceFrames(const scoped_refptr<VP9Picture>& pic);
-
   // Decode and possibly output |pic| (if the picture is to be shown).
   // Return true on success, false otherwise.
   bool DecodeAndOutputPicture(scoped_refptr<VP9Picture> pic);
@@ -120,7 +117,7 @@
   // Get frame context state after decoding |pic| from the accelerator, and call
   // |context_refresh_cb| with the acquired state.
   void UpdateFrameContext(
-      const scoped_refptr<VP9Picture>& pic,
+      scoped_refptr<VP9Picture> pic,
       const base::Callback<void(const Vp9FrameContext&)>& context_refresh_cb);
 
   // Called on error, when decoding cannot continue. Sets state_ to kError and
diff --git a/media/gpu/windows/d3d11_vp9_accelerator.cc b/media/gpu/windows/d3d11_vp9_accelerator.cc
index c035e54..9aa120c5 100644
--- a/media/gpu/windows/d3d11_vp9_accelerator.cc
+++ b/media/gpu/windows/d3d11_vp9_accelerator.cc
@@ -70,12 +70,12 @@
   return base::MakeRefCounted<D3D11VP9Picture>(picture_buffer);
 }
 
-bool D3D11VP9Accelerator::BeginFrame(D3D11VP9Picture* pic) {
+bool D3D11VP9Accelerator::BeginFrame(const D3D11VP9Picture& pic) {
   // This |decrypt_context| has to be outside the if block because pKeyInfo in
   // D3D11_VIDEO_DECODER_BEGIN_FRAME_CRYPTO_SESSION is a pointer (to a GUID).
   base::Optional<CdmProxyContext::D3D11DecryptContext> decrypt_context;
   std::unique_ptr<D3D11_VIDEO_DECODER_BEGIN_FRAME_CRYPTO_SESSION> content_key;
-  if (const DecryptConfig* config = pic->decrypt_config()) {
+  if (const DecryptConfig* config = pic.decrypt_config()) {
     DCHECK(cdm_proxy_context_) << "No CdmProxyContext but picture is encrypted";
     decrypt_context = cdm_proxy_context_->GetD3D11DecryptContext(
         CdmProxy::KeyType::kDecryptAndDecode, config->key_id());
@@ -96,7 +96,7 @@
   HRESULT hr;
   do {
     hr = video_context_->DecoderBeginFrame(
-        video_decoder_.Get(), pic->picture_buffer()->output_view().Get(),
+        video_decoder_.Get(), pic.picture_buffer()->output_view().Get(),
         content_key ? sizeof(*content_key) : 0, content_key.get());
   } while (hr == E_PENDING || hr == D3DERR_WASSTILLDRAWING);
 
@@ -108,10 +108,9 @@
   return true;
 }
 
-void D3D11VP9Accelerator::CopyFrameParams(
-    const scoped_refptr<D3D11VP9Picture>& pic,
-    DXVA_PicParams_VP9* pic_params) {
-#define SET_PARAM(a, b) pic_params->a = pic->frame_hdr->b
+void D3D11VP9Accelerator::CopyFrameParams(const D3D11VP9Picture& pic,
+                                          DXVA_PicParams_VP9* pic_params) {
+#define SET_PARAM(a, b) pic_params->a = pic.frame_hdr->b
 #define COPY_PARAM(a) SET_PARAM(a, a)
 
   COPY_PARAM(profile);
@@ -132,10 +131,11 @@
   // extra_plane, BitDepthMinus8Luma, and BitDepthMinus8Chroma are initialized
   // at 0 already.
 
-  pic_params->CurrPic.Index7Bits = pic->level();
-  pic_params->frame_type = !pic->frame_hdr->IsKeyframe();
-  pic_params->subsampling_x = pic->frame_hdr->subsampling_x;
-  pic_params->subsampling_y = pic->frame_hdr->subsampling_y;
+  pic_params->CurrPic.Index7Bits = pic.level();
+  pic_params->frame_type = !pic.frame_hdr->IsKeyframe();
+
+  COPY_PARAM(subsampling_x);
+  COPY_PARAM(subsampling_y);
 
   SET_PARAM(width, frame_width);
   SET_PARAM(height, frame_height);
@@ -147,11 +147,11 @@
 }
 
 void D3D11VP9Accelerator::CopyReferenceFrames(
-    const scoped_refptr<D3D11VP9Picture>& pic,
+    const D3D11VP9Picture& pic,
     DXVA_PicParams_VP9* pic_params,
     const Vp9ReferenceFrameVector& ref_frames) {
   D3D11_TEXTURE2D_DESC texture_descriptor;
-  pic->picture_buffer()->texture()->GetDesc(&texture_descriptor);
+  pic.picture_buffer()->texture()->GetDesc(&texture_descriptor);
 
   for (size_t i = 0; i < base::size(pic_params->ref_frame_map); i++) {
     auto ref_pic = ref_frames.GetFrame(i);
@@ -169,16 +169,15 @@
   }
 }
 
-void D3D11VP9Accelerator::CopyFrameRefs(
-    DXVA_PicParams_VP9* pic_params,
-    const scoped_refptr<D3D11VP9Picture>& pic) {
+void D3D11VP9Accelerator::CopyFrameRefs(DXVA_PicParams_VP9* pic_params,
+                                        const D3D11VP9Picture& pic) {
   for (size_t i = 0; i < base::size(pic_params->frame_refs); i++) {
     pic_params->frame_refs[i] =
-        pic_params->ref_frame_map[pic->frame_hdr->ref_frame_idx[i]];
+        pic_params->ref_frame_map[pic.frame_hdr->ref_frame_idx[i]];
   }
 
   for (size_t i = 0; i < base::size(pic_params->ref_frame_sign_bias); i++) {
-    pic_params->ref_frame_sign_bias[i] = pic->frame_hdr->ref_frame_sign_bias[i];
+    pic_params->ref_frame_sign_bias[i] = pic.frame_hdr->ref_frame_sign_bias[i];
   }
 }
 
@@ -210,10 +209,9 @@
   }
 }
 
-void D3D11VP9Accelerator::CopyQuantParams(
-    DXVA_PicParams_VP9* pic_params,
-    const scoped_refptr<D3D11VP9Picture>& pic) {
-#define SET_PARAM(a, b) pic_params->a = pic->frame_hdr->quant_params.b
+void D3D11VP9Accelerator::CopyQuantParams(DXVA_PicParams_VP9* pic_params,
+                                          const D3D11VP9Picture& pic) {
+#define SET_PARAM(a, b) pic_params->a = pic.frame_hdr->quant_params.b
   SET_PARAM(base_qindex, base_q_idx);
   SET_PARAM(y_dc_delta_q, delta_q_y_dc);
   SET_PARAM(uv_dc_delta_q, delta_q_uv_dc);
@@ -250,13 +248,12 @@
 #undef SET_PARAM
 }
 
-void D3D11VP9Accelerator::CopyHeaderSizeAndID(
-    DXVA_PicParams_VP9* pic_params,
-    const scoped_refptr<D3D11VP9Picture>& pic) {
+void D3D11VP9Accelerator::CopyHeaderSizeAndID(DXVA_PicParams_VP9* pic_params,
+                                              const D3D11VP9Picture& pic) {
   pic_params->uncompressed_header_size_byte_aligned =
-      static_cast<USHORT>(pic->frame_hdr->uncompressed_header_size);
+      static_cast<USHORT>(pic.frame_hdr->uncompressed_header_size);
   pic_params->first_partition_size =
-      static_cast<USHORT>(pic->frame_hdr->header_size_in_bytes);
+      static_cast<USHORT>(pic.frame_hdr->header_size_in_bytes);
 
   // StatusReportFeedbackNumber "should not be equal to 0".
   pic_params->StatusReportFeedbackNumber = ++status_feedback_;
@@ -264,7 +261,7 @@
 
 bool D3D11VP9Accelerator::SubmitDecoderBuffer(
     const DXVA_PicParams_VP9& pic_params,
-    const scoped_refptr<D3D11VP9Picture>& pic) {
+    const D3D11VP9Picture& pic) {
 #define GET_BUFFER(type)                                 \
   RETURN_ON_HR_FAILURE(GetDecoderBuffer,                 \
                        video_context_->GetDecoderBuffer( \
@@ -282,15 +279,15 @@
   RELEASE_BUFFER(D3D11_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS);
 
   size_t buffer_offset = 0;
-  while (buffer_offset < pic->frame_hdr->frame_size) {
+  while (buffer_offset < pic.frame_hdr->frame_size) {
     GET_BUFFER(D3D11_VIDEO_DECODER_BUFFER_BITSTREAM);
-    size_t copy_size = pic->frame_hdr->frame_size - buffer_offset;
+    size_t copy_size = pic.frame_hdr->frame_size - buffer_offset;
     bool contains_end = true;
     if (copy_size > buffer_size) {
       copy_size = buffer_size;
       contains_end = false;
     }
-    memcpy(buffer, pic->frame_hdr->data + buffer_offset, copy_size);
+    memcpy(buffer, pic.frame_hdr->data + buffer_offset, copy_size);
     RELEASE_BUFFER(D3D11_VIDEO_DECODER_BUFFER_BITSTREAM);
 
     DXVA_Slice_VPx_Short slice_info;
@@ -325,7 +322,7 @@
     buffers[2].DataOffset = 0;
     buffers[2].DataSize = copy_size;
 
-    const DecryptConfig* config = pic->decrypt_config();
+    const DecryptConfig* config = pic.decrypt_config();
     if (config) {
       buffers[2].pIV = const_cast<char*>(config->iv().data());
       buffers[2].IVSize = config->iv().size();
@@ -349,27 +346,26 @@
 }
 
 bool D3D11VP9Accelerator::SubmitDecode(
-    const scoped_refptr<VP9Picture>& picture,
+    scoped_refptr<VP9Picture> picture,
     const Vp9SegmentationParams& segmentation_params,
     const Vp9LoopFilterParams& loop_filter_params,
     const Vp9ReferenceFrameVector& reference_frames,
     const base::Closure& on_finished_cb) {
-  scoped_refptr<D3D11VP9Picture> pic(
-      static_cast<D3D11VP9Picture*>(picture.get()));
+  D3D11VP9Picture* pic = static_cast<D3D11VP9Picture*>(picture.get());
 
-  if (!BeginFrame(pic.get()))
+  if (!BeginFrame(*pic))
     return false;
 
   DXVA_PicParams_VP9 pic_params = {};
-  CopyFrameParams(pic, &pic_params);
-  CopyReferenceFrames(pic, &pic_params, reference_frames);
-  CopyFrameRefs(&pic_params, pic);
+  CopyFrameParams(*pic, &pic_params);
+  CopyReferenceFrames(*pic, &pic_params, reference_frames);
+  CopyFrameRefs(&pic_params, *pic);
   CopyLoopFilterParams(&pic_params, loop_filter_params);
-  CopyQuantParams(&pic_params, pic);
+  CopyQuantParams(&pic_params, *pic);
   CopySegmentationParams(&pic_params, segmentation_params);
-  CopyHeaderSizeAndID(&pic_params, pic);
+  CopyHeaderSizeAndID(&pic_params, *pic);
 
-  if (!SubmitDecoderBuffer(pic_params, pic))
+  if (!SubmitDecoderBuffer(pic_params, *pic))
     return false;
 
   RETURN_ON_HR_FAILURE(DecoderEndFrame,
@@ -379,8 +375,7 @@
   return true;
 }
 
-bool D3D11VP9Accelerator::OutputPicture(
-    const scoped_refptr<VP9Picture>& picture) {
+bool D3D11VP9Accelerator::OutputPicture(scoped_refptr<VP9Picture> picture) {
   D3D11VP9Picture* pic = static_cast<D3D11VP9Picture*>(picture.get());
   client_->OutputResult(picture.get(), pic->picture_buffer());
   return true;
@@ -390,9 +385,8 @@
   return false;
 }
 
-bool D3D11VP9Accelerator::GetFrameContext(
-    const scoped_refptr<VP9Picture>& picture,
-    Vp9FrameContext* frame_context) {
+bool D3D11VP9Accelerator::GetFrameContext(scoped_refptr<VP9Picture> picture,
+                                          Vp9FrameContext* frame_context) {
   return false;
 }
 
diff --git a/media/gpu/windows/d3d11_vp9_accelerator.h b/media/gpu/windows/d3d11_vp9_accelerator.h
index a96e8b8..c75505d7 100644
--- a/media/gpu/windows/d3d11_vp9_accelerator.h
+++ b/media/gpu/windows/d3d11_vp9_accelerator.h
@@ -31,42 +31,41 @@
 
   scoped_refptr<VP9Picture> CreateVP9Picture() override;
 
-  // TODO(crbug/890054): Use constref instead of scoped_refptr.
-  bool SubmitDecode(const scoped_refptr<VP9Picture>& picture,
+  bool SubmitDecode(scoped_refptr<VP9Picture> picture,
                     const Vp9SegmentationParams& segmentation_params,
                     const Vp9LoopFilterParams& loop_filter_params,
                     const Vp9ReferenceFrameVector& reference_frames,
                     const base::Closure& on_finished_cb) override;
 
-  bool OutputPicture(const scoped_refptr<VP9Picture>& picture) override;
+  bool OutputPicture(scoped_refptr<VP9Picture> picture) override;
 
   bool IsFrameContextRequired() const override;
 
-  bool GetFrameContext(const scoped_refptr<VP9Picture>& picture,
+  bool GetFrameContext(scoped_refptr<VP9Picture> picture,
                        Vp9FrameContext* frame_context) override;
 
  private:
   // Helper methods for SubmitDecode
-  bool BeginFrame(D3D11VP9Picture* pic);
+  bool BeginFrame(const D3D11VP9Picture& pic);
 
   // TODO(crbug/890054): Use constref instead of scoped_refptr.
-  void CopyFrameParams(const scoped_refptr<D3D11VP9Picture>& pic,
+  void CopyFrameParams(const D3D11VP9Picture& pic,
                        DXVA_PicParams_VP9* pic_params);
-  void CopyReferenceFrames(const scoped_refptr<D3D11VP9Picture>& pic,
+  void CopyReferenceFrames(const D3D11VP9Picture& pic,
                            DXVA_PicParams_VP9* pic_params,
                            const Vp9ReferenceFrameVector& ref_frames);
   void CopyFrameRefs(DXVA_PicParams_VP9* pic_params,
-                     const scoped_refptr<D3D11VP9Picture>& picture);
+                     const D3D11VP9Picture& picture);
   void CopyLoopFilterParams(DXVA_PicParams_VP9* pic_params,
                             const Vp9LoopFilterParams& loop_filter_params);
   void CopyQuantParams(DXVA_PicParams_VP9* pic_params,
-                       const scoped_refptr<D3D11VP9Picture>& pic);
+                       const D3D11VP9Picture& pic);
   void CopySegmentationParams(DXVA_PicParams_VP9* pic_params,
                               const Vp9SegmentationParams& segmentation_params);
   void CopyHeaderSizeAndID(DXVA_PicParams_VP9* pic_params,
-                           const scoped_refptr<D3D11VP9Picture>& pic);
+                           const D3D11VP9Picture& pic);
   bool SubmitDecoderBuffer(const DXVA_PicParams_VP9& pic_params,
-                           const scoped_refptr<D3D11VP9Picture>& pic);
+                           const D3D11VP9Picture& pic);
 
   void RecordFailure(const std::string& fail_type, const std::string& reason);
 
diff --git a/net/base/network_change_notifier_win.cc b/net/base/network_change_notifier_win.cc
index 3393d9a..d93e5b9 100644
--- a/net/base/network_change_notifier_win.cc
+++ b/net/base/network_change_notifier_win.cc
@@ -12,7 +12,10 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -30,32 +33,18 @@
 
 }  // namespace
 
-// Thread on which we can run DnsConfigService, which requires AssertIOAllowed
-// to open registry keys and to handle FilePathWatcher updates.
-class NetworkChangeNotifierWin::DnsConfigServiceThread : public base::Thread {
- public:
-  DnsConfigServiceThread() : base::Thread("DnsConfigService") {}
-
-  ~DnsConfigServiceThread() override { Stop(); }
-
-  void Init() override {
-    service_ = DnsConfigService::CreateSystemService();
-    service_->WatchConfig(base::Bind(&NetworkChangeNotifier::SetDnsConfig));
-  }
-
-  void CleanUp() override { service_.reset(); }
-
- private:
-  std::unique_ptr<DnsConfigService> service_;
-
-  DISALLOW_COPY_AND_ASSIGN(DnsConfigServiceThread);
-};
-
 NetworkChangeNotifierWin::NetworkChangeNotifierWin()
     : NetworkChangeNotifier(NetworkChangeCalculatorParamsWin()),
       is_watching_(false),
       sequential_failures_(0),
-      dns_config_service_thread_(new DnsConfigServiceThread()),
+      dns_config_service_runner_(
+          base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})),
+      dns_config_service_(
+          DnsConfigService::CreateSystemService().release(),
+          // Ensure DnsConfigService lives on |dns_config_service_runner_|
+          // to prevent races where NetworkChangeNotifierWin outlives
+          // ScopedTaskEnvironment. https://crbug.com/938126
+          base::OnTaskRunnerDeleter(dns_config_service_runner_)),
       last_computed_connection_type_(RecomputeCurrentConnectionType()),
       last_announced_offline_(last_computed_connection_type_ ==
                               CONNECTION_NONE),
@@ -65,7 +54,7 @@
 }
 
 NetworkChangeNotifierWin::~NetworkChangeNotifierWin() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (is_watching_) {
     CancelIPChangeNotify(&addr_overlapped_);
     addr_watcher_.StopWatching();
@@ -204,15 +193,15 @@
                           : NetworkChangeNotifier::CONNECTION_NONE;
 }
 
-void NetworkChangeNotifierWin::RecomputeCurrentConnectionTypeOnDnsThread(
-    base::Callback<void(ConnectionType)> reply_callback) const {
+void NetworkChangeNotifierWin::RecomputeCurrentConnectionTypeOnDnsSequence(
+    base::OnceCallback<void(ConnectionType)> reply_callback) const {
   // Unretained is safe in this call because this object owns the thread and the
   // thread is stopped in this object's destructor.
   base::PostTaskAndReplyWithResult(
-      dns_config_service_thread_->task_runner().get(), FROM_HERE,
-      base::Bind(&NetworkChangeNotifierWin::RecomputeCurrentConnectionType,
-                 base::Unretained(this)),
-      reply_callback);
+      dns_config_service_runner_.get(), FROM_HERE,
+      base::BindOnce(&NetworkChangeNotifierWin::RecomputeCurrentConnectionType,
+                     base::Unretained(this)),
+      std::move(reply_callback));
 }
 
 NetworkChangeNotifier::ConnectionType
@@ -228,19 +217,19 @@
 }
 
 void NetworkChangeNotifierWin::OnObjectSignaled(HANDLE object) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(is_watching_);
   is_watching_ = false;
 
   // Start watching for the next address change.
   WatchForAddressChange();
 
-  RecomputeCurrentConnectionTypeOnDnsThread(base::Bind(
+  RecomputeCurrentConnectionTypeOnDnsSequence(base::BindOnce(
       &NetworkChangeNotifierWin::NotifyObservers, weak_factory_.GetWeakPtr()));
 }
 
 void NetworkChangeNotifierWin::NotifyObservers(ConnectionType connection_type) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   SetCurrentConnectionType(connection_type);
   NotifyObserversOfIPAddressChange();
 
@@ -257,7 +246,7 @@
 }
 
 void NetworkChangeNotifierWin::WatchForAddressChange() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!is_watching_);
 
   // NotifyAddrChange occasionally fails with ERROR_OPEN_FAILED for unknown
@@ -287,7 +276,7 @@
   // network change event, since network changes were not being observed in
   // that interval.
   if (sequential_failures_ > 0) {
-    RecomputeCurrentConnectionTypeOnDnsThread(
+    RecomputeCurrentConnectionTypeOnDnsSequence(
         base::Bind(&NetworkChangeNotifierWin::NotifyObservers,
                    weak_factory_.GetWeakPtr()));
   }
@@ -302,12 +291,13 @@
 }
 
 bool NetworkChangeNotifierWin::WatchForAddressChangeInternal() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!dns_config_service_thread_->IsRunning()) {
-    dns_config_service_thread_->StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  }
+  dns_config_service_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&DnsConfigService::WatchConfig,
+                                base::Unretained(dns_config_service_.get()),
+                                base::BindRepeating(
+                                    &NetworkChangeNotifier::SetDnsConfig)));
 
   ResetEventIfSignaled(addr_overlapped_.hEvent);
   HANDLE handle = nullptr;
@@ -320,7 +310,7 @@
 }
 
 void NetworkChangeNotifierWin::NotifyParentOfConnectionTypeChange() {
-  RecomputeCurrentConnectionTypeOnDnsThread(base::Bind(
+  RecomputeCurrentConnectionTypeOnDnsSequence(base::BindOnce(
       &NetworkChangeNotifierWin::NotifyParentOfConnectionTypeChangeImpl,
       weak_factory_.GetWeakPtr()));
 }
diff --git a/net/base/network_change_notifier_win.h b/net/base/network_change_notifier_win.h
index beef6ba..533c90ac 100644
--- a/net/base/network_change_notifier_win.h
+++ b/net/base/network_change_notifier_win.h
@@ -12,17 +12,25 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
+#include "base/sequence_checker.h"
 #include "base/timer/timer.h"
 #include "base/win/object_watcher.h"
 #include "net/base/net_export.h"
 #include "net/base/network_change_notifier.h"
 
+namespace base {
+class SequencedTaskRunner;
+struct OnTaskRunnerDeleter;
+}  // namespace base
+
 namespace net {
 
-// NetworkChangeNotifierWin uses a ThreadChecker, as all its internal
-// notification code must be called on the thread it is created and destroyed
+class DnsConfigService;
+
+// NetworkChangeNotifierWin uses a SequenceChecker, as all its internal
+// notification code must be called on the sequence it is created and destroyed
 // on.  All the NetworkChangeNotifier methods it implements are threadsafe.
 class NET_EXPORT_PRIVATE NetworkChangeNotifierWin
     : public NetworkChangeNotifier,
@@ -32,8 +40,8 @@
 
   // Begins listening for a single subsequent address change.  If it fails to
   // start watching, it retries on a timer.  Must be called only once, on the
-  // thread |this| was created on.  This cannot be called in the constructor, as
-  // WatchForAddressChangeInternal is mocked out in unit tests.
+  // sequence |this| was created on.  This cannot be called in the constructor,
+  // as WatchForAddressChangeInternal is mocked out in unit tests.
   // TODO(mmenke): Consider making this function a part of the
   //               NetworkChangeNotifier interface, so other subclasses can be
   //               unit tested in similar fashion, as needed.
@@ -48,30 +56,29 @@
   int sequential_failures() { return sequential_failures_; }
 
  private:
-  class DnsConfigServiceThread;
   friend class NetworkChangeNotifierWinTest;
 
   // NetworkChangeNotifier methods:
   ConnectionType GetCurrentConnectionType() const override;
 
   // ObjectWatcher::Delegate methods:
-  // Must only be called on the thread |this| was created on.
+  // Must only be called on the sequence |this| was created on.
   void OnObjectSignaled(HANDLE object) override;
 
   // Does the actual work to determine the current connection type.
   // It is not thread safe, see crbug.com/324913.
   virtual ConnectionType RecomputeCurrentConnectionType() const;
 
-  // Calls RecomputeCurrentConnectionTypeImpl on the DNS thread and runs
-  // |reply_callback| with the type on the calling thread.
-  virtual void RecomputeCurrentConnectionTypeOnDnsThread(
-      base::Callback<void(ConnectionType)> reply_callback) const;
+  // Calls RecomputeCurrentConnectionTypeImpl on the DNS sequence and runs
+  // |reply_callback| with the type on the calling sequence.
+  virtual void RecomputeCurrentConnectionTypeOnDnsSequence(
+      base::OnceCallback<void(ConnectionType)> reply_callback) const;
 
   void SetCurrentConnectionType(ConnectionType connection_type);
 
   // Notifies IP address change observers of a change immediately, and notifies
   // network state change observers on a delay.  Must only be called on the
-  // thread |this| was created on.
+  // sequence |this| was created on.
   void NotifyObservers(ConnectionType connection_type);
 
   // Forwards connection type notifications to parent class.
@@ -80,14 +87,14 @@
 
   // Tries to start listening for a single subsequent address change.  Returns
   // false on failure.  The caller is responsible for updating |is_watching_|.
-  // Virtual for unit tests.  Must only be called on the thread |this| was
+  // Virtual for unit tests.  Must only be called on the sequence |this| was
   // created on.
   virtual bool WatchForAddressChangeInternal();
 
   static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsWin();
 
-  // All member variables may only be accessed on the thread |this| was created
-  // on.
+  // All member variables may only be accessed on the sequence |this| was
+  // created on.
 
   // False when not currently watching for network change events.  This only
   // happens on initialization and when WatchForAddressChangeInternal fails and
@@ -102,8 +109,11 @@
   // Number of times WatchForAddressChange has failed in a row.
   int sequential_failures_;
 
-  // Thread on which we can run DnsConfigService.
-  std::unique_ptr<DnsConfigServiceThread> dns_config_service_thread_;
+  // |dns_config_service_| will live on this runner.
+  scoped_refptr<base::SequencedTaskRunner> dns_config_service_runner_;
+  // DnsConfigService that lives on |dns_config_service_runner_|.
+  std::unique_ptr<DnsConfigService, base::OnTaskRunnerDeleter>
+      dns_config_service_;
 
   mutable base::Lock last_computed_connection_type_lock_;
   ConnectionType last_computed_connection_type_;
@@ -114,7 +124,7 @@
   // Number of times polled to check if still offline.
   int offline_polls_;
 
-  THREAD_CHECKER(thread_checker_);
+  SEQUENCE_CHECKER(sequence_checker_);
 
   // Used for calling WatchForAddressChange again on failure.
   base::WeakPtrFactory<NetworkChangeNotifierWin> weak_factory_;
diff --git a/net/base/network_change_notifier_win_unittest.cc b/net/base/network_change_notifier_win_unittest.cc
index ba695806..0d51205 100644
--- a/net/base/network_change_notifier_win_unittest.cc
+++ b/net/base/network_change_notifier_win_unittest.cc
@@ -43,10 +43,10 @@
   }
 
   // From NetworkChangeNotifierWin.
-  void RecomputeCurrentConnectionTypeOnDnsThread(
-      base::Callback<void(ConnectionType)> reply_callback) const override {
+  void RecomputeCurrentConnectionTypeOnDnsSequence(
+      base::OnceCallback<void(ConnectionType)> reply_callback) const override {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(reply_callback,
+        FROM_HERE, base::BindOnce(std::move(reply_callback),
                                   NetworkChangeNotifier::CONNECTION_UNKNOWN));
   }
 
diff --git a/net/dns/context_host_resolver.cc b/net/dns/context_host_resolver.cc
index 5dad541..9423f1d 100644
--- a/net/dns/context_host_resolver.cc
+++ b/net/dns/context_host_resolver.cc
@@ -161,11 +161,6 @@
   context_ = request_context;
 }
 
-const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-ContextHostResolver::GetDnsOverHttpsServersForTesting() const {
-  return manager_->GetDnsOverHttpsServersForTesting();
-}
-
 HostResolverManager* ContextHostResolver::GetManagerForTesting() {
   return manager_;
 }
diff --git a/net/dns/context_host_resolver.h b/net/dns/context_host_resolver.h
index 8856d3d..e6b5cf5 100644
--- a/net/dns/context_host_resolver.h
+++ b/net/dns/context_host_resolver.h
@@ -58,8 +58,6 @@
                  bool* secure_out) const override;
   std::unique_ptr<base::Value> GetDnsConfigAsValue() const override;
   void SetRequestContext(URLRequestContext* request_context) override;
-  const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-  GetDnsOverHttpsServersForTesting() const override;
   HostResolverManager* GetManagerForTesting() override;
   const URLRequestContext* GetContextForTesting() const override;
 
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc
index ebb5044..01108c5 100644
--- a/net/dns/dns_config_service_win.cc
+++ b/net/dns/dns_config_service_win.cc
@@ -18,13 +18,13 @@
 #include "base/macros.h"
 #include "base/memory/free_deleter.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/scoped_blocking_call.h"
-#include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/win/registry.h"
@@ -76,11 +76,11 @@
     key_.Open(HKEY_LOCAL_MACHINE, key, KEY_QUERY_VALUE);
   }
 
-  ~RegistryReader() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); }
+  ~RegistryReader() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
 
   bool ReadString(const base::char16* name,
                   DnsSystemSettings::RegString* out) const {
-    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     out->set = false;
     if (!key_.Valid()) {
       // Assume that if the |key_| is invalid then the key is missing.
@@ -96,7 +96,7 @@
 
   bool ReadDword(const base::char16* name,
                  DnsSystemSettings::RegDword* out) const {
-    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     out->set = false;
     if (!key_.Valid()) {
       // Assume that if the |key_| is invalid then the key is missing.
@@ -113,7 +113,7 @@
  private:
   base::win::RegKey key_;
 
-  THREAD_CHECKER(thread_checker_);
+  SEQUENCE_CHECKER(sequence_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(RegistryReader);
 };
@@ -275,10 +275,10 @@
   typedef base::Callback<void(bool succeeded)> CallbackType;
   RegistryWatcher() {}
 
-  ~RegistryWatcher() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); }
+  ~RegistryWatcher() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
 
   bool Watch(const base::char16* key, const CallbackType& callback) {
-    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(!callback.is_null());
     DCHECK(callback_.is_null());
     callback_ = callback;
@@ -290,7 +290,7 @@
   }
 
   void OnObjectSignaled() {
-    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(!callback_.is_null());
     if (key_.StartWatching(base::Bind(&RegistryWatcher::OnObjectSignaled,
                                       base::Unretained(this)))) {
@@ -305,7 +305,7 @@
   CallbackType callback_;
   base::win::RegKey key_;
 
-  THREAD_CHECKER(thread_checker_);
+  SEQUENCE_CHECKER(sequence_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(RegistryWatcher);
 };
@@ -564,7 +564,7 @@
   return result;
 }
 
-// Watches registry and HOSTS file for changes. Must live on a thread which
+// Watches registry and HOSTS file for changes. Must live on a sequence which
 // allows IO.
 class DnsConfigServiceWin::Watcher
     : public NetworkChangeNotifier::IPAddressObserver {
@@ -729,13 +729,16 @@
   DISALLOW_COPY_AND_ASSIGN(HostsReader);
 };
 
-DnsConfigServiceWin::DnsConfigServiceWin()
-    : config_reader_(new ConfigReader(this)),
-      hosts_reader_(new HostsReader(this)) {}
+DnsConfigServiceWin::DnsConfigServiceWin() {
+  // Allow constructing on one sequence and living on another.
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
 
 DnsConfigServiceWin::~DnsConfigServiceWin() {
-  config_reader_->Cancel();
-  hosts_reader_->Cancel();
+  if (config_reader_)
+    config_reader_->Cancel();
+  if (hosts_reader_)
+    hosts_reader_->Cancel();
 }
 
 void DnsConfigServiceWin::ReadNow() {
@@ -744,6 +747,10 @@
 }
 
 bool DnsConfigServiceWin::StartWatching() {
+  if (!config_reader_)
+    config_reader_ = base::MakeRefCounted<ConfigReader>(this);
+  if (!hosts_reader_)
+    hosts_reader_ = base::MakeRefCounted<HostsReader>(this);
   // TODO(szym): re-start watcher if that makes sense. http://crbug.com/116139
   watcher_.reset(new Watcher(this));
   UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", DNS_CONFIG_WATCH_STARTED,
diff --git a/net/dns/dns_config_service_win.h b/net/dns/dns_config_service_win.h
index a1224068..098d476 100644
--- a/net/dns/dns_config_service_win.h
+++ b/net/dns/dns_config_service_win.h
@@ -124,6 +124,11 @@
     const DnsSystemSettings& settings,
     DnsConfig* dns_config);
 
+// Service for reading and watching Windows system DNS settings. This object is
+// not thread-safe and methods may perform blocking I/O so methods must be
+// called on a sequence that allows blocking (i.e. base::MayBlock). It may be
+// constructed on a different sequence than which it's later called on.
+// WatchConfig() must be called prior to ReadConfig().
 // Use DnsConfigService::CreateSystemService to use it outside of tests.
 class NET_EXPORT_PRIVATE DnsConfigServiceWin : public DnsConfigService {
  public:
diff --git a/net/dns/host_resolver.cc b/net/dns/host_resolver.cc
index 3e40081..065c188 100644
--- a/net/dns/host_resolver.cc
+++ b/net/dns/host_resolver.cc
@@ -64,11 +64,6 @@
   NOTREACHED();
 }
 
-const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-HostResolver::GetDnsOverHttpsServersForTesting() const {
-  return nullptr;
-}
-
 HostResolverManager* HostResolver::GetManagerForTesting() {
   // Should be overridden in any HostResolver implementation where this method
   // may be called.
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index 43ddb19..69a5d4f8 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -298,20 +298,9 @@
   // only be called once.
   virtual void SetRequestContext(URLRequestContext* request_context);
 
-  // Returns the currently configured DNS over HTTPS servers. Returns nullptr if
-  // DNS over HTTPS is not enabled.
-  virtual const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-  GetDnsOverHttpsServersForTesting() const;
-
   virtual HostResolverManager* GetManagerForTesting();
   virtual const URLRequestContext* GetContextForTesting() const;
 
-  // TODO(crbug.com/934402): Cleanup the various property-setting methods in
-  // this class.  Many only affect manager-wide properties and can probably be
-  // removed and replaced by calling equivalent methods directly on the
-  // underlying HostResolverManager (through NetworkService that generally owns
-  // that manager).
-
   // Creates a new HostResolver. |manager| must outlive the returned resolver.
   //
   // If |mapping_rules| is non-empty, the mapping rules will be applied to
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index 8dcb04d..15828f70 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -166,6 +166,8 @@
   void AddHostCacheInvalidator(HostCache::Invalidator* invalidator);
   void RemoveHostCacheInvalidator(const HostCache::Invalidator* invalidator);
 
+  // Returns the currently configured DNS over HTTPS servers. Returns nullptr if
+  // DNS over HTTPS is not enabled.
   const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
   GetDnsOverHttpsServersForTesting() const;
 
diff --git a/net/dns/mapped_host_resolver.cc b/net/dns/mapped_host_resolver.cc
index 86caea5..182958a 100644
--- a/net/dns/mapped_host_resolver.cc
+++ b/net/dns/mapped_host_resolver.cc
@@ -90,11 +90,6 @@
   impl_->SetRequestContext(request_context);
 }
 
-const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-MappedHostResolver::GetDnsOverHttpsServersForTesting() const {
-  return impl_->GetDnsOverHttpsServersForTesting();
-}
-
 HostResolverManager* MappedHostResolver::GetManagerForTesting() {
   return impl_->GetManagerForTesting();
 }
diff --git a/net/dns/mapped_host_resolver.h b/net/dns/mapped_host_resolver.h
index 7e3e1914..ca8c9f0 100644
--- a/net/dns/mapped_host_resolver.h
+++ b/net/dns/mapped_host_resolver.h
@@ -60,8 +60,6 @@
                  bool* secure_out) const override;
   std::unique_ptr<base::Value> GetDnsConfigAsValue() const override;
   void SetRequestContext(URLRequestContext* request_context) override;
-  const std::vector<DnsConfig::DnsOverHttpsServerConfig>*
-  GetDnsOverHttpsServersForTesting() const override;
   HostResolverManager* GetManagerForTesting() override;
 
  private:
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index cd342a3..8c9488e2 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -71138,6 +71138,27 @@
     { "name": "delawarenation-nsn.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
     { "name": "minoritywhip.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
     { "name": "gopwhip.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "artransparency.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "ohiosos.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "abitaspringsla.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "nscai.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "morgancountysheriffal.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "franklincountyflorida.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "azrangers.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "sterlingheights.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "innovateohio.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "ohioag.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "cookcountyclerkil.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "aoicprobationil.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "hartfordct.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "bega-dc.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "cityofwoodward-ok.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "manhassetparkdistrictny.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "cecilga.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "floridaagriculture.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "flagriculture.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "floridaconsumerhelp.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheriffpawneecountyne.gov", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
     { "name": "bmoattachments.org", "policy": "public-suffix-requested", "mode": "force-https", "include_subdomains": true },
     // END OF ETLD-OWNER REQUESTED ENTRIES
 
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 48b75a87..769a92d 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -353,3 +353,8 @@
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_deprecate_queued_control_frames,
           false)
+
+// When true, QUIC server will drop IETF QUIC Version Negotiation packets.
+QUIC_FLAG(bool,
+          FLAGS_quic_restart_flag_quic_server_drop_version_negotiation,
+          false)
diff --git a/remoting/android/BUILD.gn b/remoting/android/BUILD.gn
index 0821d13..888389503 100644
--- a/remoting/android/BUILD.gn
+++ b/remoting/android/BUILD.gn
@@ -13,6 +13,7 @@
 generate_jni("jni_headers") {
   sources = [
     "java/src/org/chromium/chromoting/jni/Client.java",
+    "java/src/org/chromium/chromoting/jni/DirectoryService.java",
     "java/src/org/chromium/chromoting/jni/GlDisplay.java",
     "java/src/org/chromium/chromoting/jni/JniInterface.java",
     "java/src/org/chromium/chromoting/jni/JniOAuthTokenGetter.java",
diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni
index 7c37778..92dc7eca 100644
--- a/remoting/android/client_java_tmpl.gni
+++ b/remoting/android/client_java_tmpl.gni
@@ -26,7 +26,6 @@
       "FlingAnimationJob.java",
       "HostInfo.java",
       "HostListAdapter.java",
-      "HostListManager.java",
       "InputEventSender.java",
       "InputFeedbackRadiusMapper.java",
       "InputModeChangedEventParameter.java",
@@ -73,6 +72,7 @@
       "jni/Client.java",
       "jni/ConnectionListener.java",
       "jni/GlDisplay.java",
+      "jni/DirectoryService.java",
       "jni/JniInterface.java",
       "jni/JniOAuthTokenGetter.java",
       "jni/TouchEventData.java",
@@ -82,15 +82,20 @@
 
     deps = [
       "//base:base_java",
+      "//base:jni_java",
       "//remoting/android:remoting_android_client_java_resources",
       "//remoting/android:remoting_apk_manifest",
+      "//remoting/proto/remoting/v1:directory_proto_java",
       "//third_party/android_deps:android_arch_lifecycle_common_java",
       "//third_party/android_deps:android_support_v7_appcompat_java",
       "//third_party/android_deps:com_android_support_mediarouter_v7_java",
       "//third_party/android_deps:com_android_support_support_annotations_java",
+      "//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
       "//ui/android:ui_utils_java",
     ]
 
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
     srcjar_deps = [ "//remoting/client/jni:jni_enums" ]
 
     if (defined(invoker.play_services_package)) {
diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
index 3b8180bd..017a95262 100644
--- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
+++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
@@ -40,7 +40,8 @@
 import org.chromium.chromoting.help.HelpSingleton;
 import org.chromium.chromoting.jni.Client;
 import org.chromium.chromoting.jni.ConnectionListener;
-import org.chromium.chromoting.jni.ConnectionListener.State;
+import org.chromium.chromoting.jni.DirectoryService;
+import org.chromium.chromoting.jni.DirectoryServiceRequestError;
 import org.chromium.chromoting.jni.JniOAuthTokenGetter;
 
 import java.util.ArrayList;
@@ -50,8 +51,9 @@
  * The user interface for querying and displaying a user's host list from the directory server. It
  * also requests and renews authentication tokens using the system account manager.
  */
-public class Chromoting extends AppCompatActivity implements ConnectionListener,
-        AccountSwitcher.Callback, HostListManager.Callback, View.OnClickListener {
+public class Chromoting extends AppCompatActivity
+        implements ConnectionListener, AccountSwitcher.Callback, DirectoryService.HostListCallback,
+                   DirectoryService.DeleteCallback, View.OnClickListener {
     private static final String TAG = "Chromoting";
 
     /** Only accounts of this type will be selectable for authentication. */
@@ -73,7 +75,7 @@
     private String mAccount;
 
     /** Helper for fetching the host list. */
-    private HostListManager mHostListManager;
+    private DirectoryService mDirectoryService;
 
     /** List of hosts. */
     private HostInfo[] mHosts = new HostInfo[0];
@@ -231,7 +233,7 @@
         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
 
-        mHostListManager = new HostListManager();
+        mDirectoryService = new DirectoryService();
 
         // Get ahold of our view widgets.
         mHostListView = (ListView) findViewById(R.id.hostList_chooser);
@@ -556,7 +558,7 @@
                 });
 
         final SessionConnector connector =
-                new SessionConnector(mClient, this, this, mHostListManager);
+                new SessionConnector(mClient, this, this, mDirectoryService);
         mAuthenticator = new SessionAuthenticator(this, mClient, host);
         mHostConnectingConsumer.consume(mAccount, new OAuthTokenFetcher.Callback() {
             @Override
@@ -585,7 +587,7 @@
         mHostListRetrievingConsumer.consume(mAccount, new OAuthTokenFetcher.Callback() {
             @Override
             public void onTokenFetched(String token) {
-                mHostListManager.retrieveHostList(token, Chromoting.this);
+                mDirectoryService.retrieveHostList(Chromoting.this);
             }
 
             @Override
@@ -602,7 +604,7 @@
         mHostDeletingConsumer.consume(mAccount, new OAuthTokenFetcher.Callback() {
             @Override
             public void onTokenFetched(String token) {
-                mHostListManager.deleteHost(token, hostId, Chromoting.this);
+                mDirectoryService.deleteHost(hostId, Chromoting.this);
             }
 
             @Override
@@ -648,7 +650,7 @@
 
     @Override
     public void onHostListReceived(HostInfo[] hosts) {
-        // Store a copy of the array, so that it can't be mutated by the HostListManager. HostInfo
+        // Store a copy of the array, so that it can't be mutated by the DirectoryService. HostInfo
         // is an immutable type, so a shallow copy of the array is sufficient here.
         mHosts = Arrays.copyOf(hosts, hosts.length);
         updateHostListView();
@@ -656,29 +658,24 @@
     }
 
     @Override
-    public void onHostUpdated() {
-        // Not implemented Yet.
-    }
-
-    @Override
     public void onHostDeleted() {
         // Refresh the host list. there is no need to refetch the auth token again.
         // onHostListReceived is in charge to hide the progress indicator.
-        mHostListManager.retrieveHostList(mHostDeletingConsumer.getLatestToken(), this);
+        mDirectoryService.retrieveHostList(this);
     }
 
     @Override
-    public void onError(@HostListManager.Error int error) {
+    public void onError(@DirectoryServiceRequestError int error) {
         String explanation = null;
         switch (error) {
-            case HostListManager.Error.AUTH_FAILED:
+            case DirectoryServiceRequestError.AUTH_FAILED:
                 break;
-            case HostListManager.Error.NETWORK_ERROR:
+            case DirectoryServiceRequestError.NETWORK_ERROR:
                 explanation = getString(R.string.error_network_error);
                 break;
-            case HostListManager.Error.UNEXPECTED_RESPONSE:
-            case HostListManager.Error.SERVICE_UNAVAILABLE:
-            case HostListManager.Error.UNKNOWN:
+            case DirectoryServiceRequestError.UNEXPECTED_RESPONSE:
+            case DirectoryServiceRequestError.SERVICE_UNAVAILABLE:
+            case DirectoryServiceRequestError.UNKNOWN:
                 explanation = getString(R.string.error_unexpected);
                 break;
             default:
diff --git a/remoting/android/java/src/org/chromium/chromoting/HostInfo.java b/remoting/android/java/src/org/chromium/chromoting/HostInfo.java
index 795347f8..1318a007 100644
--- a/remoting/android/java/src/org/chromium/chromoting/HostInfo.java
+++ b/remoting/android/java/src/org/chromium/chromoting/HostInfo.java
@@ -27,6 +27,7 @@
     public final String name;
     public final String id;
     public final String jabberId;
+    public final String ftlId;
     public final String publicKey;
     public final boolean isOnline;
     public final String hostOfflineReason;
@@ -47,30 +48,21 @@
     // to have a safe fallback in case it does happen.
     private static final Date FALLBACK_DATE_IN_THE_PAST = new Date(0);
 
-    public HostInfo(String name, String id, String jabberId, String publicKey,
+    public HostInfo(String name, String id, String jabberId, String ftlId, String publicKey,
             ArrayList<String> tokenUrlPatterns, boolean isOnline, String hostOfflineReason,
-            String updatedTime, String hostVersion, String hostOs, String hostOsVersion) {
+            Date updatedTime, String hostVersion, String hostOs, String hostOsVersion) {
         this.name = name;
         this.id = id;
         this.jabberId = jabberId;
+        this.ftlId = ftlId;
         this.publicKey = publicKey;
         this.mTokenUrlPatterns = tokenUrlPatterns;
         this.isOnline = isOnline;
         this.hostOfflineReason = hostOfflineReason;
+        this.updatedTime = updatedTime;
         this.hostVersion = hostVersion;
         this.hostOs = hostOs;
         this.hostOsVersion = hostOsVersion;
-
-        ParsePosition parsePosition = new ParsePosition(0);
-        SimpleDateFormat format = new SimpleDateFormat(RFC_3339_FORMAT, Locale.US);
-        format.setTimeZone(TimeZone.getTimeZone("UTC"));
-        Date updatedTimeCandidate = format.parse(updatedTime, parsePosition);
-        if (updatedTimeCandidate == null) {
-            Log.e(TAG, "Unparseable host.updatedTime JSON: errorIndex = %d, input = %s",
-                    parsePosition.getErrorIndex(), updatedTime);
-            updatedTimeCandidate = FALLBACK_DATE_IN_THE_PAST;
-        }
-        this.updatedTime = updatedTimeCandidate;
     }
 
     private int getHostOfflineReasonResourceId(String reason) {
@@ -132,10 +124,23 @@
                 }
             }
         }
+
+        final String updatedTime = json.optString("updatedTime");
+        ParsePosition parsePosition = new ParsePosition(0);
+        SimpleDateFormat format = new SimpleDateFormat(RFC_3339_FORMAT, Locale.US);
+        format.setTimeZone(TimeZone.getTimeZone("UTC"));
+        Date updatedTimeCandidate = format.parse(updatedTime, parsePosition);
+        if (updatedTimeCandidate == null) {
+            Log.e(TAG, "Unparseable host.updatedTime JSON: errorIndex = %d, input = %s",
+                    parsePosition.getErrorIndex(), updatedTime);
+            updatedTimeCandidate = FALLBACK_DATE_IN_THE_PAST;
+        }
+        final Date parsedUpdatedTime = updatedTimeCandidate;
+
         return new HostInfo(json.getString("hostName"), json.getString("hostId"),
-                json.optString("jabberId"), json.optString("publicKey"), tokenUrlPatterns,
+                json.optString("jabberId"), null, json.optString("publicKey"), tokenUrlPatterns,
                 json.optString("status").equals("ONLINE"), json.optString("hostOfflineReason"),
-                json.optString("updatedTime"), json.optString("hostVersion"),
-                json.optString("hostOs"), json.optString("hostOsVersion"));
+                parsedUpdatedTime, json.optString("hostVersion"), json.optString("hostOs"),
+                json.optString("hostOsVersion"));
     }
 }
diff --git a/remoting/android/java/src/org/chromium/chromoting/HostListManager.java b/remoting/android/java/src/org/chromium/chromoting/HostListManager.java
deleted file mode 100644
index 2b5133bd..0000000
--- a/remoting/android/java/src/org/chromium/chromoting/HostListManager.java
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chromoting;
-
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.support.annotation.IntDef;
-import android.support.annotation.Nullable;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import org.chromium.base.Log;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Locale;
-import java.util.Scanner;
-
-/** Helper for fetching and modifying the host list. */
-@SuppressWarnings("JavaLangClash")
-public class HostListManager {
-    @IntDef({Error.AUTH_FAILED, Error.NETWORK_ERROR, Error.SERVICE_UNAVAILABLE,
-            Error.UNEXPECTED_RESPONSE, Error.UNKNOWN})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Error {
-        int AUTH_FAILED = 0;
-        int NETWORK_ERROR = 1;
-        int SERVICE_UNAVAILABLE = 2;
-        int UNEXPECTED_RESPONSE = 3;
-        int UNKNOWN = 4;
-    }
-
-    /** Callback for receiving the host list, or getting notified of an error. */
-    public interface Callback {
-        void onHostListReceived(HostInfo[] response);
-        void onHostUpdated();
-        void onHostDeleted();
-        void onError(@Error int error);
-    }
-
-    /**
-     * Represents a response from the directory server.
-     * If the request failed, |error| will not be null and |body| will be null.
-     * If the request succeeds, |error| will be null and |body| will not be null.
-     **/
-    private static class Response {
-        public final @Error Integer error;
-        public final String body;
-        public Response(@Nullable @Error Integer error, String body) {
-            this.error = error;
-            this.body = body;
-        }
-    }
-
-    private static final String TAG = "Chromoting";
-
-    /** Path from which to download a user's host list JSON object. */
-    private static final String HOST_LIST_PATH =
-            "https://www.googleapis.com/chromoting/v1/@me/hosts";
-
-    /** Callback handler to be used for network operations. */
-    private Handler mNetworkThread;
-
-    /** Handler for main thread. */
-    private Handler mMainThread;
-
-    public HostListManager() {
-        // Thread responsible for downloading the host list.
-
-        mMainThread = new Handler(Looper.getMainLooper());
-    }
-
-    private void runOnNetworkThread(Runnable runnable) {
-        if (mNetworkThread == null) {
-            HandlerThread thread = new HandlerThread("network");
-            thread.start();
-            mNetworkThread = new Handler(thread.getLooper());
-        }
-        mNetworkThread.post(runnable);
-    }
-
-    /**
-      * Causes the host list to be fetched on a background thread. This should be called on the
-      * main thread, and callbacks will also be invoked on the main thread. On success,
-      * callback.onHostListReceived() will be called, otherwise callback.onError() will be called
-      * with an error-code describing the failure.
-      */
-    public void retrieveHostList(final String authToken, final Callback callback) {
-        runOnNetworkThread(new Runnable() {
-            @Override
-            public void run() {
-                doRetrieveHostList(authToken, callback);
-            }
-        });
-    }
-
-    private void doRetrieveHostList(String authToken, Callback callback) {
-        Response response = sendRequest(authToken, HOST_LIST_PATH, "GET", null, null);
-        if (response.error != null) {
-            postError(callback, response.error);
-            return;
-        }
-
-        // Parse directory response.
-        ArrayList<HostInfo> hostList = new ArrayList<HostInfo>();
-        try {
-            JSONObject data = new JSONObject(response.body).getJSONObject("data");
-            if (data.has("items")) {
-                JSONArray hostsJson = data.getJSONArray("items");
-
-                int index = 0;
-                while (!hostsJson.isNull(index)) {
-                    JSONObject hostJson = hostsJson.getJSONObject(index);
-                    // If a host is only recently registered, it may be missing some of the keys
-                    // below. It should still be visible in the list, even though a connection
-                    // attempt will fail because of the missing keys. The failed attempt will
-                    // trigger reloading of the host-list, by which time the keys will hopefully be
-                    // present, and the retried connection can succeed.
-                    HostInfo host = HostInfo.create(hostJson);
-                    hostList.add(host);
-                    ++index;
-                }
-            }
-        } catch (JSONException ex) {
-            // Logging the exception stack trace may be too spammy.
-            Log.e(TAG, "Error parsing host list response: %s", ex.getMessage());
-            postError(callback, Error.UNEXPECTED_RESPONSE);
-            return;
-        }
-
-        sortHosts(hostList);
-
-        final Callback callbackFinal = callback;
-        final HostInfo[] hosts = hostList.toArray(new HostInfo[hostList.size()]);
-        mMainThread.post(new Runnable() {
-            @Override
-            public void run() {
-                callbackFinal.onHostListReceived(hosts);
-            }
-        });
-    }
-
-    /**
-     * Updates a host on the background thread. On success, callback.onHostUpdated() will be called,
-     * otherwise callback.onError() will be called with an error-code describing the failure.
-     */
-    public void putHost(final String authToken, final String hostId, final String hostName,
-                        final String publicKey, final Callback callback) {
-        runOnNetworkThread(new Runnable() {
-            @Override
-            public void run() {
-                doPutHost(authToken, hostId, hostName, publicKey, callback);
-            }
-        });
-    }
-
-    private void doPutHost(String authToken, String hostId, String hostName, String publicKey,
-                           final Callback callback) {
-        String requestJson;
-        try {
-            JSONObject data = new JSONObject();
-            data.put("hostId", hostId);
-            data.put("hostName", hostName);
-            data.put("publicKey", publicKey);
-            JSONObject request = new JSONObject();
-            request.put("data", data);
-            requestJson = request.toString();
-        } catch (JSONException ex) {
-            Log.e(TAG, "Error creating put host JSON string: %s", ex.getMessage());
-            postError(callback, Error.UNKNOWN);
-            return;
-        }
-        Response response = sendRequest(authToken, HOST_LIST_PATH + '/' + hostId, "PUT",
-                "application/json", requestJson);
-        if (response.error != null) {
-            postError(callback, response.error);
-        } else {
-            mMainThread.post(new Runnable() {
-                @Override
-                public void run() {
-                    callback.onHostUpdated();
-                }
-            });
-        }
-    }
-
-    /**
-     * Deletes a host on the background thread. On success, callback.onHostUpdated() will be called,
-     * otherwise callback.onError() will be called with an error-code describing the failure.
-     */
-    public void deleteHost(final String authToken, final String hostId,
-                           final Callback callback) {
-        runOnNetworkThread(new Runnable() {
-            @Override
-            public void run() {
-                doDeleteHost(authToken, hostId, callback);
-            }
-        });
-    }
-
-    private void doDeleteHost(String authToken, String hostId, final Callback callback) {
-        Response response = sendRequest(authToken, HOST_LIST_PATH + '/' + hostId, "DELETE",
-                null, null);
-        if (response.error != null) {
-            postError(callback, response.error);
-        } else {
-            mMainThread.post(new Runnable() {
-                @Override
-                public void run() {
-                    callback.onHostDeleted();
-                }
-            });
-        }
-    }
-
-    /** Posts error to callback on main thread. */
-    private void postError(Callback callback, @Error int error) {
-        final Callback callbackFinal = callback;
-        final @Error int errorFinal = error;
-        mMainThread.post(new Runnable() {
-            @Override
-            public void run() {
-                callbackFinal.onError(errorFinal);
-            }
-        });
-    }
-
-    private static void sortHosts(ArrayList<HostInfo> hosts) {
-        Comparator<HostInfo> hostComparator = new Comparator<HostInfo>() {
-            @Override
-            public int compare(HostInfo a, HostInfo b) {
-                if (a.isOnline != b.isOnline) {
-                    return a.isOnline ? -1 : 1;
-                }
-                String aName = a.name.toUpperCase(Locale.getDefault());
-                String bName = b.name.toUpperCase(Locale.getDefault());
-                return aName.compareTo(bName);
-            }
-        };
-        Collections.sort(hosts, hostComparator);
-    }
-
-    /**
-     * Sends request to the url and returns the response.
-     * @param authToken auth token
-     * @param url the URL to send the request
-     * @param method /GET/POST/PUT/DELETE/etc.
-     * @param requestContentType The content type of the request body. This can be null.
-     * @param requestBody This can be null.
-     * @return The response.
-     */
-    private static Response sendRequest(String authToken, String url, String method,
-                                        String requestContentType, String requestBody) {
-        HttpURLConnection link = null;
-        @Nullable
-        @Error
-        Integer error = null;
-        try {
-            link = (HttpURLConnection) new URL(url).openConnection();
-            link.setRequestMethod(method);
-            link.setRequestProperty("Authorization", "OAuth " + authToken);
-            if (requestContentType != null) {
-                link.setRequestProperty("Content-Type", requestContentType);
-            }
-            if (requestBody != null) {
-                byte[] requestBytes = requestBody.getBytes("UTF-8");
-                OutputStream outStream = link.getOutputStream();
-                outStream.write(requestBytes);
-                outStream.close();
-            }
-
-            // Listen for the server to respond.
-            int status = link.getResponseCode();
-            // TODO(yuweih): Turn this switch statement into range testing. e.g. 200-299 = OK.
-            switch (status) {
-                case HttpURLConnection.HTTP_OK:  // 200
-                case HttpURLConnection.HTTP_NO_CONTENT:  // 204
-                    break;
-                case HttpURLConnection.HTTP_UNAUTHORIZED:  // 401
-                    error = Error.AUTH_FAILED;
-                    break;
-                case HttpURLConnection.HTTP_BAD_GATEWAY:  // 502
-                case HttpURLConnection.HTTP_UNAVAILABLE:  // 503
-                    error = Error.SERVICE_UNAVAILABLE;
-                    break;
-                default:
-                    error = Error.UNKNOWN;
-            }
-
-            if (error != null) {
-                return new Response(error, null);
-            }
-
-            StringBuilder responseBuilder = new StringBuilder();
-            Scanner incoming = new Scanner(link.getInputStream());
-            while (incoming.hasNext()) {
-                responseBuilder.append(incoming.nextLine());
-            }
-            incoming.close();
-            return new Response(null, responseBuilder.toString());
-        } catch (MalformedURLException ex) {
-            // This should never happen.
-            throw new RuntimeException("Unexpected error while fetching host list: ", ex);
-        } catch (IOException ex) {
-            return new Response(Error.NETWORK_ERROR, null);
-        } finally {
-            if (link != null) {
-                link.disconnect();
-            }
-        }
-    }
-}
diff --git a/remoting/android/java/src/org/chromium/chromoting/SessionConnector.java b/remoting/android/java/src/org/chromium/chromoting/SessionConnector.java
index 5bf59ed..4153e219 100644
--- a/remoting/android/java/src/org/chromium/chromoting/SessionConnector.java
+++ b/remoting/android/java/src/org/chromium/chromoting/SessionConnector.java
@@ -6,16 +6,18 @@
 
 import org.chromium.chromoting.jni.Client;
 import org.chromium.chromoting.jni.ConnectionListener;
+import org.chromium.chromoting.jni.DirectoryService;
+import org.chromium.chromoting.jni.DirectoryServiceRequestError;
 
 /**
  * This class manages making a connection to a host, with logic for reloading the host list and
  * retrying the connection in the case of a stale host JID.
  */
-public class SessionConnector implements ConnectionListener, HostListManager.Callback {
+public class SessionConnector implements ConnectionListener, DirectoryService.HostListCallback {
     private Client mClient;
     private ConnectionListener mConnectionListener;
-    private HostListManager.Callback mHostListCallback;
-    private HostListManager mHostListManager;
+    private DirectoryService.HostListCallback mHostListCallback;
+    private DirectoryService mDirectoryService;
     private SessionAuthenticator mAuthenticator;
 
     private String mAccountName;
@@ -36,14 +38,14 @@
     /**
      * @param connectionListener Object to be notified on connection success/failure.
      * @param hostListCallback Object to be notified whenever the host list is reloaded.
-     * @param hostListManager The object used for reloading the host list.
+     * @param directoryService The object used for reloading the host list.
      */
     public SessionConnector(Client client, ConnectionListener connectionListener,
-            HostListManager.Callback hostListCallback, HostListManager hostListManager) {
+            DirectoryService.HostListCallback hostListCallback, DirectoryService directoryService) {
         mClient = client;
         mConnectionListener = connectionListener;
         mHostListCallback = hostListCallback;
-        mHostListManager = hostListManager;
+        mDirectoryService = directoryService;
     }
 
     /** Initiates a connection to the host. */
@@ -77,7 +79,7 @@
 
     private void reloadHostListAndConnect() {
         mTriedReloadingHostList = true;
-        mHostListManager.retrieveHostList(mAuthToken, this);
+        mDirectoryService.retrieveHostList(this);
     }
 
     @Override
@@ -130,17 +132,7 @@
     }
 
     @Override
-    public void onHostUpdated() {
-        // Not implemented Yet.
-    }
-
-    @Override
-    public void onHostDeleted() {
-        // Not implemented Yet.
-    }
-
-    @Override
-    public void onError(@HostListManager.Error int error) {
+    public void onError(@DirectoryServiceRequestError int error) {
         // Connection failed and reloading the host list also failed, so report the connection
         // error.
         mConnectionListener.onConnectionState(ConnectionListener.State.FAILED,
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java b/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java
new file mode 100644
index 0000000..24609d2c
--- /dev/null
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java
@@ -0,0 +1,137 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chromoting.jni;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JCaller;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.chromoting.HostInfo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+
+/** Helper for fetching and modifying the host list. */
+@JNINamespace("remoting")
+public class DirectoryService {
+    /** All callbacks can receive an error. */
+    public interface CallbackBase { void onError(@DirectoryServiceRequestError int error); }
+
+    /** Callback for receiving the host list */
+    public interface HostListCallback extends CallbackBase {
+        void onHostListReceived(HostInfo[] response);
+    }
+
+    /** Callback for receiving the delete result */
+    public interface DeleteCallback extends CallbackBase { void onHostDeleted(); }
+
+    public DirectoryService() {
+        mNativeJniDirectoryService = DirectoryServiceJni.get().init();
+    }
+
+    /**
+     * Causes the host list to be fetched on a background thread. This should be called on the
+     * main thread, and callbacks will also be invoked on the main thread. On success,
+     * callback.onHostListReceived() will be called, otherwise callback.onError() will be called
+     * with an error-code describing the failure.
+     */
+    public void retrieveHostList(final HostListCallback callback) {
+        DirectoryServiceJni.get().retrieveHostList(this, mNativeJniDirectoryService, callback);
+    }
+
+    /**
+     * Deletes a host on the background thread. On success, callback.onHostUpdated() will be called,
+     * otherwise callback.onError() will be called with an error-code describing the failure.
+     */
+    public void deleteHost(final String hostId, final DeleteCallback callback) {
+        DirectoryServiceJni.get().deleteHost(this, mNativeJniDirectoryService, hostId, callback);
+    }
+
+    @Override
+    public void finalize() {
+        DirectoryServiceJni.get().destroy(this, mNativeJniDirectoryService);
+    }
+
+    private final long mNativeJniDirectoryService;
+
+    @NativeMethods
+    interface Natives {
+        long init();
+        void retrieveHostList(@JCaller DirectoryService self, long nativeJniDirectoryService,
+                HostListCallback callback);
+        void deleteHost(@JCaller DirectoryService self, long nativeJniDirectoryService,
+                String hostId, DeleteCallback callback);
+        void destroy(@JCaller DirectoryService self, long nativeJniDirectoryService);
+    }
+
+    /**
+     * Called by native code when the host list has been successfully retrieved.
+     * @param callback The Java callback originally provided to retrieveHostList.
+     * @param response The serialized response.
+     */
+    @CalledByNative
+    static void onHostListRetrieved(final HostListCallback callback, final byte[] response) {
+        remoting.apis.v1.GetHostListResponse hostListResponse;
+        try {
+            hostListResponse = remoting.apis.v1.GetHostListResponse.parseFrom(response);
+        } catch (InvalidProtocolBufferException e) {
+            callback.onError(DirectoryServiceRequestError.UNEXPECTED_RESPONSE);
+            return;
+        }
+
+        final int count = hostListResponse.getHostsCount();
+
+        final HostInfo[] hosts = new HostInfo[count];
+
+        for (int i = 0; i < count; ++i) {
+            remoting.apis.v1.HostInfo hostProto = hostListResponse.getHosts(i);
+            HostInfo host = new HostInfo(hostProto.getHostName(), hostProto.getHostId(),
+                    hostProto.getJabberId(), hostProto.getFtlId(), hostProto.getPublicKey(),
+                    new ArrayList<String>(hostProto.getTokenUrlPatternList()),
+                    hostProto.getStatus() == remoting.apis.v1.HostInfo.Status.ONLINE,
+                    hostProto.getHostOfflineReason(), new Date(hostProto.getLastSeenTime()),
+                    hostProto.getHostVersion(), hostProto.getHostOsName(),
+                    hostProto.getHostOsVersion());
+            hosts[i] = host;
+        }
+
+        Arrays.sort(hosts, new Comparator<HostInfo>() {
+            @Override
+            public int compare(HostInfo o1, HostInfo o2) {
+                // Sort online hosts first.
+                int result = -Boolean.compare(o1.isOnline, o2.isOnline);
+                if (result == 0) {
+                    result = String.CASE_INSENSITIVE_ORDER.compare(o1.name, o2.name);
+                }
+                return result;
+            }
+        });
+
+        callback.onHostListReceived(hosts);
+    }
+
+    /**
+     * Called by native code when the delete request was successfully completed.
+     * @param callback The Java callback originally provided to deleteHost.
+     */
+    @CalledByNative
+    static void onHostDeleted(final DeleteCallback callback) {
+        callback.onHostDeleted();
+    }
+
+    /**
+     * Called by native code when an error occurs while performing the request.
+     * @param callback The Java callback originally provided to deleteHost.
+     * @param error The type of error that occurred.
+     */
+    @CalledByNative
+    static void onError(final CallbackBase callback, @DirectoryServiceRequestError int error) {
+        callback.onError(error);
+    }
+}
diff --git a/remoting/client/BUILD.gn b/remoting/client/BUILD.gn
index 9889a93..57ec138 100644
--- a/remoting/client/BUILD.gn
+++ b/remoting/client/BUILD.gn
@@ -63,7 +63,6 @@
       "//remoting/base:authorization",
       "//remoting/client/input",
       "//remoting/client/ui",
-      "//remoting/proto/remoting/v1:directory_grpc_library",
       "//services/network:network_service",
       "//services/network/public/mojom",
     ]
diff --git a/remoting/client/jni/BUILD.gn b/remoting/client/jni/BUILD.gn
index 34c08965..30ff03e 100644
--- a/remoting/client/jni/BUILD.gn
+++ b/remoting/client/jni/BUILD.gn
@@ -22,6 +22,7 @@
     "//remoting/base",
     "//remoting/client",
     "//remoting/client/display",
+    "//remoting/proto/remoting/v1:directory_grpc_library",
     "//remoting/protocol",
     "//ui/gfx",
   ]
@@ -30,6 +31,8 @@
     "egl_thread_context.h",
     "jni_client.cc",
     "jni_client.h",
+    "jni_directory_service.cc",
+    "jni_directory_service.h",
     "jni_gl_display_handler.cc",
     "jni_gl_display_handler.h",
     "jni_oauth_token_getter.cc",
@@ -54,6 +57,7 @@
 
 java_cpp_enum("jni_enums") {
   sources = [
+    "jni_directory_service.h",
     "jni_oauth_token_getter.h",
   ]
 }
diff --git a/remoting/client/jni/jni_directory_service.cc b/remoting/client/jni/jni_directory_service.cc
new file mode 100644
index 0000000..4487ab7
--- /dev/null
+++ b/remoting/client/jni/jni_directory_service.cc
@@ -0,0 +1,136 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "remoting/client/jni/jni_directory_service.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/macros.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "jni/DirectoryService_jni.h"
+#include "remoting/base/grpc_support/grpc_async_unary_request.h"
+#include "remoting/base/grpc_support/grpc_authenticated_executor.h"
+#include "remoting/base/grpc_support/grpc_channel.h"
+#include "remoting/base/oauth_token_getter.h"
+#include "remoting/base/service_urls.h"
+#include "remoting/proto/remoting/v1/directory_service.grpc.pb.h"
+
+#include "base/logging.h"
+
+namespace remoting {
+
+namespace {
+
+JniDirectoryService::RequestError MapError(grpc::StatusCode status_code) {
+  switch (status_code) {
+    case grpc::UNAVAILABLE:
+      return JniDirectoryService::RequestError::SERVICE_UNAVAILABLE;
+      break;
+    case grpc::PERMISSION_DENIED:
+    case grpc::UNAUTHENTICATED:
+      return JniDirectoryService::RequestError::AUTH_FAILED;
+      break;
+    default:
+      return JniDirectoryService::RequestError::UNKNOWN;
+      break;
+  }
+}
+
+}  // namespace
+
+JniDirectoryService::JniDirectoryService()
+    : grpc_executor_(&token_getter_),
+      stub_(apis::v1::RemotingDirectoryService::NewStub(
+          CreateSslChannelForEndpoint(
+              ServiceUrls::GetInstance()->remoting_server_endpoint()))),
+      sequence_(base::SequencedTaskRunnerHandle::Get()) {}
+
+JniDirectoryService::~JniDirectoryService() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+void JniDirectoryService::RetrieveHostList(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    const base::android::JavaParamRef<jobject>& callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  grpc_executor_.ExecuteRpc(CreateGrpcAsyncUnaryRequest(
+      base::BindOnce(
+          &apis::v1::RemotingDirectoryService::Stub::AsyncGetHostList,
+          base::Unretained(stub_.get())),
+      std::make_unique<grpc::ClientContext>(), apis::v1::GetHostListRequest(),
+      base::BindOnce(&JniDirectoryService::OnHostListRetrieved,
+                     base::Unretained(this),
+                     base::android::ScopedJavaGlobalRef<jobject>(callback))));
+}
+
+void JniDirectoryService::DeleteHost(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller,
+    const base::android::JavaParamRef<jstring>& host_id,
+    const base::android::JavaParamRef<jobject>& callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  apis::v1::DeleteHostRequest request;
+  request.set_host_id(base::android::ConvertJavaStringToUTF8(env, host_id));
+  grpc_executor_.ExecuteRpc(CreateGrpcAsyncUnaryRequest(
+      base::BindOnce(&apis::v1::RemotingDirectoryService::Stub::AsyncDeleteHost,
+                     base::Unretained(stub_.get())),
+      std::make_unique<grpc::ClientContext>(), request,
+      base::BindOnce(&JniDirectoryService::OnHostDeleted,
+                     base::Unretained(this),
+                     base::android::ScopedJavaGlobalRef<jobject>(callback))));
+}
+
+void JniDirectoryService::Destroy(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& caller) {
+  if (sequence_->RunsTasksInCurrentSequence()) {
+    delete this;
+  } else {
+    sequence_->DeleteSoon(FROM_HERE, this);
+  }
+}
+
+void JniDirectoryService::OnHostListRetrieved(
+    base::android::ScopedJavaGlobalRef<jobject> callback,
+    const grpc::Status& status,
+    const apis::v1::GetHostListResponse& response) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  if (status.ok()) {
+    Java_DirectoryService_onHostListRetrieved(
+        env, callback,
+        base::android::ToJavaByteArray(env, response.SerializeAsString()));
+  } else {
+    LOG(ERROR) << "Retrieving host list failed: " << status.error_message();
+    Java_DirectoryService_onError(
+        env, callback, static_cast<jint>(MapError(status.error_code())));
+  }
+}
+
+void JniDirectoryService::OnHostDeleted(
+    base::android::ScopedJavaGlobalRef<jobject> callback,
+    const grpc::Status& status,
+    const apis::v1::DeleteHostResponse& response) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  if (status.ok()) {
+    Java_DirectoryService_onHostDeleted(env, callback);
+  } else {
+    LOG(ERROR) << "Deleting host failed: " << status.error_message();
+    // TODO(rkjnsn): Translate error code from status.
+    Java_DirectoryService_onError(
+        env, callback, static_cast<jint>(MapError(status.error_code())));
+  }
+}
+
+static jlong JNI_DirectoryService_Init(JNIEnv* env) {
+  return reinterpret_cast<intptr_t>(new JniDirectoryService());
+}
+
+}  // namespace remoting
diff --git a/remoting/client/jni/jni_directory_service.h b/remoting/client/jni/jni_directory_service.h
new file mode 100644
index 0000000..469810b
--- /dev/null
+++ b/remoting/client/jni/jni_directory_service.h
@@ -0,0 +1,63 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef REMOTING_CLIENT_JNI_JNI_DIRECTORY_SERVICE_H_
+#define REMOTING_CLIENT_JNI_JNI_DIRECTORY_SERVICE_H_
+
+#include <memory>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/sequence_checker.h"
+#include "base/sequenced_task_runner.h"
+#include "remoting/base/grpc_support/grpc_authenticated_executor.h"
+#include "remoting/client/jni/jni_oauth_token_getter.h"
+#include "remoting/proto/remoting/v1/directory_service.grpc.pb.h"
+
+namespace remoting {
+
+class JniDirectoryService {
+ public:
+  // TODO(rkjnsn): Update error codes to better align with those returned by the
+  // new gRPC API.
+  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chromoting.jni
+  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: DirectoryServiceRequestError
+  enum class RequestError : int {
+    AUTH_FAILED = 0,
+    NETWORK_ERROR = 1,
+    SERVICE_UNAVAILABLE = 2,
+    UNEXPECTED_RESPONSE = 3,
+    UNKNOWN = 4,
+  };
+  JniDirectoryService();
+  ~JniDirectoryService();
+
+  void RetrieveHostList(JNIEnv* env,
+                        const base::android::JavaParamRef<jobject>& caller,
+                        const base::android::JavaParamRef<jobject>& callback);
+  void DeleteHost(JNIEnv* env,
+                  const base::android::JavaParamRef<jobject>& caller,
+                  const base::android::JavaParamRef<jstring>& host_id,
+                  const base::android::JavaParamRef<jobject>& callback);
+
+  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
+
+ private:
+  void OnHostListRetrieved(base::android::ScopedJavaGlobalRef<jobject> callback,
+                           const grpc::Status& status,
+                           const apis::v1::GetHostListResponse& response);
+  void OnHostDeleted(base::android::ScopedJavaGlobalRef<jobject> callback,
+                     const grpc::Status& status,
+                     const apis::v1::DeleteHostResponse& response);
+
+  JniOAuthTokenGetter token_getter_;
+  GrpcAuthenticatedExecutor grpc_executor_;
+  std::unique_ptr<apis::v1::RemotingDirectoryService::Stub> stub_;
+  scoped_refptr<base::SequencedTaskRunner> sequence_;
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace remoting
+
+#endif  // REMOTING_CLIENT_JNI_JNI_DIRECTORY_SERVICE_H_
diff --git a/remoting/ios/app/app_delegate.h b/remoting/ios/app/app_delegate.h
index 52f0d52..31fea8b 100644
--- a/remoting/ios/app/app_delegate.h
+++ b/remoting/ios/app/app_delegate.h
@@ -20,8 +20,10 @@
 // controller.
 - (void)navigateToHelpCenter:(UINavigationController*)navigationController;
 
-// Presents the help center modally onto the topmost view controller.
+// Presents contents modally onto the topmost view controller.
 - (void)presentHelpCenter;
+- (void)presentTermsOfService;
+- (void)presentPrivacyPolicy;
 
 // TODO(yuweih): Replace calls to this method with methods from HelpAndFeedback.
 // This will present the Send Feedback view controller onto the topmost view
diff --git a/remoting/ios/app/app_delegate.mm b/remoting/ios/app/app_delegate.mm
index 97fe90c..ff967e6 100644
--- a/remoting/ios/app/app_delegate.mm
+++ b/remoting/ios/app/app_delegate.mm
@@ -10,6 +10,7 @@
 
 #import <AVFoundation/AVFoundation.h>
 
+#include "remoting/base/string_resources.h"
 #import "remoting/ios/app/app_initializer.h"
 #import "remoting/ios/app/app_view_controller.h"
 #import "remoting/ios/app/first_launch_view_presenter.h"
@@ -21,12 +22,17 @@
 #import "remoting/ios/app/view_utils.h"
 #import "remoting/ios/app/web_view_controller.h"
 #import "remoting/ios/facade/remoting_oauth_authentication.h"
+#include "ui/base/l10n/l10n_util.h"
 
 #include "base/logging.h"
 #include "remoting/base/string_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
+static NSString* const kTosUrl = @"https://policies.google.com/terms";
+static NSString* const kPrivacyPolicyUrl =
+    @"https://policies.google.com/privacy";
+
 @interface AppDelegate ()<FirstLaunchViewControllerDelegate> {
   AppViewController* _appViewController;
   FirstLaunchViewPresenter* _firstLaunchViewPresenter;
@@ -121,6 +127,14 @@
   [UserStatusPresenter.instance start];
 }
 
+- (void)presentOnTopPresentingVC:(UIViewController*)viewController {
+  UINavigationController* navController = [[UINavigationController alloc]
+      initWithRootViewController:viewController];
+  [remoting::TopPresentingVC() presentViewController:navController
+                                            animated:YES
+                                          completion:nil];
+}
+
 #pragma mark - AppDelegate
 
 - (void)navigateToHelpCenter:(UINavigationController*)navigationController {
@@ -129,11 +143,21 @@
 }
 
 - (void)presentHelpCenter {
-  UINavigationController* navController = [[UINavigationController alloc]
-      initWithRootViewController:[[HelpViewController alloc] init]];
-  [remoting::TopPresentingVC() presentViewController:navController
-                                            animated:YES
-                                          completion:nil];
+  [self presentOnTopPresentingVC:[[HelpViewController alloc] init]];
+}
+
+- (void)presentTermsOfService {
+  [self presentOnTopPresentingVC:[[WebViewController alloc]
+                                     initWithUrl:kTosUrl
+                                           title:l10n_util::GetNSString(
+                                                     IDS_TERMS_OF_SERVICE)]];
+}
+
+- (void)presentPrivacyPolicy {
+  [self presentOnTopPresentingVC:[[WebViewController alloc]
+                                     initWithUrl:kPrivacyPolicyUrl
+                                           title:l10n_util::GetNSString(
+                                                     IDS_PRIVACY_POLICY)]];
 }
 
 - (void)presentFeedbackFlowWithContext:(NSString*)context {
diff --git a/remoting/ios/app/side_menu_items.mm b/remoting/ios/app/side_menu_items.mm
index 3da806d..39eb1df 100644
--- a/remoting/ios/app/side_menu_items.mm
+++ b/remoting/ios/app/side_menu_items.mm
@@ -81,6 +81,20 @@
                    action:^{
                      [AppDelegate.instance presentHelpCenter];
                    }],
+      ],
+      @[
+        [[SideMenuItem alloc]
+            initWithTitle:l10n_util::GetNSString(IDS_TERMS_OF_SERVICE)
+                     icon:nil
+                   action:^{
+                     [AppDelegate.instance presentTermsOfService];
+                   }],
+        [[SideMenuItem alloc]
+            initWithTitle:l10n_util::GetNSString(IDS_PRIVACY_POLICY)
+                     icon:nil
+                   action:^{
+                     [AppDelegate.instance presentPrivacyPolicy];
+                   }]
       ]
     ];
   });
diff --git a/remoting/proto/remoting/v1/BUILD.gn b/remoting/proto/remoting/v1/BUILD.gn
index 0a27851..dc82817 100644
--- a/remoting/proto/remoting/v1/BUILD.gn
+++ b/remoting/proto/remoting/v1/BUILD.gn
@@ -11,3 +11,15 @@
     "host_info.proto",
   ]
 }
+
+if (is_android) {
+  import("///build/config/android/rules.gni")
+
+  proto_java_library("directory_proto_java") {
+    proto_path = "."
+    sources = [
+      "directory_messages.proto",
+      "host_info.proto",
+    ]
+  }
+}
diff --git a/remoting/proto/remoting/v1/directory_messages.proto b/remoting/proto/remoting/v1/directory_messages.proto
index 0208160..94adc3b4 100644
--- a/remoting/proto/remoting/v1/directory_messages.proto
+++ b/remoting/proto/remoting/v1/directory_messages.proto
@@ -4,6 +4,7 @@
 
 syntax = "proto2";
 
+option java_multiple_files = true;
 option optimize_for = LITE_RUNTIME;
 
 package remoting.apis.v1;
@@ -84,6 +85,31 @@
   HEARTBEATRESULT_ERROR = 2;
 }
 
+// Requests that a new host entry to added to the Directory.
+message RegisterHostRequest {
+  // Host identity. Normally a UUID.
+  optional string host_id = 1;
+
+  // Public key for the host. Must be a 2048-bit RSA key encoded with BASE64.
+  optional string public_key = 2;
+
+  // A readable name shown to the user.
+  optional string host_name = 3;
+
+  // The OAuth client ID for the host.
+  optional string host_client_id = 4;
+}
+
+// Response to a RegisterHostRequest.
+message RegisterHostResponse {
+  // The Directory entry for the registered host.
+  optional remoting.apis.v1.HostInfo host_info = 1;
+
+  // An auth code nonce which can be exchanged for a new token from Gaia by the
+  // robot account created for the new host instance.
+  optional string auth_code = 2;
+}
+
 // Requests an auth_code with updated OAuth scopes.  Should only be called by
 // robot accounts assigned to a Me2me host.
 message UpdateRobotTokenRequest {}
diff --git a/remoting/proto/remoting/v1/directory_service.proto b/remoting/proto/remoting/v1/directory_service.proto
index b66338a..be06f04 100644
--- a/remoting/proto/remoting/v1/directory_service.proto
+++ b/remoting/proto/remoting/v1/directory_service.proto
@@ -4,6 +4,7 @@
 
 syntax = "proto2";
 
+option java_multiple_files = true;
 option optimize_for = LITE_RUNTIME;
 
 // Note that the package name is used to build the service URL.
@@ -14,6 +15,9 @@
 // A set of RPC services which provide functionality for remote access hosts
 // and clients.
 service RemotingDirectoryService {
+  // RPC service which deletes a host from the directory.
+  rpc DeleteHost(DeleteHostRequest) returns (DeleteHostResponse) {}
+
   // RPC service which returns the info for a specific host.
   rpc GetHost(GetHostRequest) returns (GetHostResponse) {}
 
@@ -24,6 +28,9 @@
   // and update Directory info such as the signaling ID and OS info.
   rpc Heartbeat(HeartbeatRequest) returns (HeartbeatResponse) {}
 
+  // RPC service which allows adding a new host to the Directory.
+  rpc RegisterHost(RegisterHostRequest) returns (RegisterHostResponse) {}
+
   // RPC service which provides an update token for a robot account.
   rpc UpdateRobotToken(UpdateRobotTokenRequest)
       returns (UpdateRobotTokenResponse) {}
diff --git a/remoting/proto/remoting/v1/host_info.proto b/remoting/proto/remoting/v1/host_info.proto
index bd90a3b..54f9907 100644
--- a/remoting/proto/remoting/v1/host_info.proto
+++ b/remoting/proto/remoting/v1/host_info.proto
@@ -4,6 +4,7 @@
 
 syntax = "proto2";
 
+option java_multiple_files = true;
 option optimize_for = LITE_RUNTIME;
 
 package remoting.apis.v1;
diff --git a/services/device/device_service_test_base.cc b/services/device/device_service_test_base.cc
index 70f751b..14ea6a61 100644
--- a/services/device/device_service_test_base.cc
+++ b/services/device/device_service_test_base.cc
@@ -19,7 +19,6 @@
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_network_connection_tracker.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 
 namespace device {
 
diff --git a/services/service_manager/background_service_manager.cc b/services/service_manager/background_service_manager.cc
index a8eb9cb..407fc55 100644
--- a/services/service_manager/background_service_manager.cc
+++ b/services/service_manager/background_service_manager.cc
@@ -68,15 +68,14 @@
 
 void BackgroundServiceManager::RegisterService(
     const Identity& identity,
-    mojom::ServicePtr service,
-    mojom::PIDReceiverRequest pid_receiver_request) {
-  mojom::ServicePtrInfo service_info = service.PassInterface();
+    mojo::PendingRemote<mojom::Service> service,
+    mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver) {
   background_thread_.task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(
           &BackgroundServiceManager::RegisterServiceOnBackgroundThread,
-          base::Unretained(this), identity, base::Passed(&service_info),
-          base::Passed(&pid_receiver_request)));
+          base::Unretained(this), identity, std::move(service),
+          std::move(metadata_receiver)));
 }
 
 void BackgroundServiceManager::InitializeOnBackgroundThread(
@@ -99,12 +98,10 @@
 
 void BackgroundServiceManager::RegisterServiceOnBackgroundThread(
     const Identity& identity,
-    mojom::ServicePtrInfo service_info,
-    mojom::PIDReceiverRequest pid_receiver_request) {
-  mojom::ServicePtr service;
-  service.Bind(std::move(service_info));
+    mojo::PendingRemote<mojom::Service> service,
+    mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver) {
   service_manager_->RegisterService(identity, std::move(service),
-                                    std::move(pid_receiver_request));
+                                    std::move(metadata_receiver));
 }
 
 }  // namespace service_manager
diff --git a/services/service_manager/background_service_manager.h b/services/service_manager/background_service_manager.h
index a5621253a..73827f9 100644
--- a/services/service_manager/background_service_manager.h
+++ b/services/service_manager/background_service_manager.h
@@ -40,19 +40,20 @@
   // Service Manager's embedder to register instances directly, without
   // requiring a Connector.
   //
-  // |pid_receiver_request| may be null, in which case the service manager
-  // assumes the new service is running in this process.
-  void RegisterService(const Identity& identity,
-                       mojom::ServicePtr service,
-                       mojom::PIDReceiverRequest pid_receiver_request);
+  // |metadata_receiver| may be null, in which case the Service Manager assumes
+  // the new service is running in the calling process.
+  void RegisterService(
+      const Identity& identity,
+      mojo::PendingRemote<mojom::Service> service,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver);
 
  private:
   void InitializeOnBackgroundThread(const std::vector<Manifest>& manifests);
   void ShutDownOnBackgroundThread(base::WaitableEvent* done_event);
   void RegisterServiceOnBackgroundThread(
       const Identity& identity,
-      mojom::ServicePtrInfo service_info,
-      mojom::PIDReceiverRequest pid_receiver_request);
+      mojo::PendingRemote<mojom::Service> service,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver);
 
   base::Thread background_thread_;
 
diff --git a/services/service_manager/public/cpp/connector.cc b/services/service_manager/public/cpp/connector.cc
index 3b07cfcc..78b85aef3 100644
--- a/services/service_manager/public/cpp/connector.cc
+++ b/services/service_manager/public/cpp/connector.cc
@@ -38,17 +38,17 @@
 
 void Connector::RegisterServiceInstance(
     const Identity& identity,
-    mojom::ServicePtr service,
-    mojom::PIDReceiverRequest pid_receiver_request,
+    mojo::PendingRemote<mojom::Service> service,
+    mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver,
     RegisterServiceInstanceCallback callback) {
   if (!BindConnectorIfNecessary())
     return;
 
   DCHECK(identity.IsValid());
-  DCHECK(service.is_bound() && pid_receiver_request.is_pending());
-  connector_->RegisterServiceInstance(
-      identity, service.PassInterface().PassHandle(),
-      std::move(pid_receiver_request), std::move(callback));
+  DCHECK(service);
+  connector_->RegisterServiceInstance(identity, service.PassPipe(),
+                                      std::move(metadata_receiver),
+                                      std::move(callback));
 }
 
 void Connector::QueryService(const std::string& service_name,
diff --git a/services/service_manager/public/cpp/connector.h b/services/service_manager/public/cpp/connector.h
index 668ae478..734c3bb 100644
--- a/services/service_manager/public/cpp/connector.h
+++ b/services/service_manager/public/cpp/connector.h
@@ -13,6 +13,7 @@
 #include "base/optional.h"
 #include "base/sequence_checker.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/public/cpp/export.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/mojom/connector.mojom.h"
@@ -107,10 +108,11 @@
   // manifest. This is considered privileged behavior.
   using RegisterServiceInstanceCallback =
       base::OnceCallback<void(mojom::ConnectResult result)>;
-  void RegisterServiceInstance(const Identity& identity,
-                               mojom::ServicePtr service,
-                               mojom::PIDReceiverRequest pid_receiver_request,
-                               RegisterServiceInstanceCallback callback = {});
+  void RegisterServiceInstance(
+      const Identity& identity,
+      mojo::PendingRemote<mojom::Service> service,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver,
+      RegisterServiceInstanceCallback callback = {});
 
   // Determines if the service for |service_name| is known, and returns
   // information about it from the catalog.
diff --git a/services/service_manager/public/cpp/manifest_unittest.cc b/services/service_manager/public/cpp/manifest_unittest.cc
index 4c2b523..9c7a0da 100644
--- a/services/service_manager/public/cpp/manifest_unittest.cc
+++ b/services/service_manager/public/cpp/manifest_unittest.cc
@@ -51,9 +51,9 @@
                   .CanConnectToInstancesInAnyGroup(true)
                   .CanRegisterOtherServiceInstances(false)
                   .Build())
-          .ExposeCapability(
-              "capability_1",
-              Manifest::InterfaceList<mojom::Connector, mojom::PIDReceiver>())
+          .ExposeCapability("capability_1",
+                            Manifest::InterfaceList<mojom::Connector,
+                                                    mojom::ProcessMetadata>())
           .ExposeCapability("capability_2",
                             Manifest::InterfaceList<mojom::Connector>())
           .RequireCapability("service_42", "computation")
@@ -87,8 +87,9 @@
             manifest.options.instance_sharing_policy);
 
   EXPECT_EQ(2u, manifest.exposed_capabilities.size());
-  EXPECT_THAT(manifest.exposed_capabilities["capability_1"],
-              ElementsAre(mojom::Connector::Name_, mojom::PIDReceiver::Name_));
+  EXPECT_THAT(
+      manifest.exposed_capabilities["capability_1"],
+      ElementsAre(mojom::Connector::Name_, mojom::ProcessMetadata::Name_));
   EXPECT_THAT(manifest.exposed_capabilities["capability_2"],
               ElementsAre(mojom::Connector::Name_));
 
diff --git a/services/service_manager/public/cpp/service_binding.cc b/services/service_manager/public/cpp/service_binding.cc
index 65bb7de1..6b364ac 100644
--- a/services/service_manager/public/cpp/service_binding.cc
+++ b/services/service_manager/public/cpp/service_binding.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/no_destructor.h"
 #include "base/synchronization/lock.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/service_manager/public/cpp/service.h"
 #include "services/tracing/public/cpp/traced_process.h"
 #include "services/tracing/public/mojom/traced_process.mojom.h"
@@ -168,11 +169,7 @@
     return;
   }
 
-  if (interface_name == mojom::ServiceFactory::Name_) {
-    factory_bindings_.AddBinding(
-        this, mojom::ServiceFactoryRequest(std::move(interface_pipe)));
-    return;
-  } else if (interface_name == tracing::mojom::TracedProcess::Name_) {
+  if (interface_name == tracing::mojom::TracedProcess::Name_) {
     tracing::TracedProcess::OnTracedProcessRequest(
         tracing::mojom::TracedProcessRequest(std::move(interface_pipe)));
     return;
@@ -181,20 +178,22 @@
   service_->OnConnect(source_info, interface_name, std::move(interface_pipe));
 }
 
-void ServiceBinding::CreateService(mojom::ServiceRequest request,
-                                   const std::string& service_name,
-                                   mojom::PIDReceiverPtr pid_receiver) {
-  auto receiver =
-      mojo::PendingReceiver<mojom::Service>(request.PassMessagePipe());
-  auto callback = base::BindOnce(
-      [](mojom::PIDReceiverPtr pid_receiver,
-         base::Optional<base::ProcessId> pid) {
-        if (pid)
-          pid_receiver->SetPID(*pid);
-      },
-      std::move(pid_receiver));
-  service_->CreatePackagedServiceInstance(service_name, std::move(receiver),
-                                          std::move(callback));
+void ServiceBinding::CreatePackagedServiceInstance(
+    const Identity& identity,
+    mojo::PendingReceiver<mojom::Service> receiver,
+    mojo::PendingRemote<mojom::ProcessMetadata> metadata) {
+  service_->CreatePackagedServiceInstance(
+      identity.name(), std::move(receiver),
+      base::BindOnce(
+          [](mojo::PendingRemote<mojom::ProcessMetadata> pending_metadata,
+             base::Optional<base::ProcessId> pid) {
+            if (pid) {
+              mojo::Remote<mojom::ProcessMetadata> metadata(
+                  std::move(pending_metadata));
+              metadata->SetPID(*pid);
+            }
+          },
+          std::move(metadata)));
 }
 
 }  // namespace service_manager
diff --git a/services/service_manager/public/cpp/service_binding.h b/services/service_manager/public/cpp/service_binding.h
index 77e7869..102b8d3 100644
--- a/services/service_manager/public/cpp/service_binding.h
+++ b/services/service_manager/public/cpp/service_binding.h
@@ -14,11 +14,11 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/mojom/connector.mojom.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/public/mojom/service_control.mojom.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 
 namespace service_manager {
 
@@ -44,8 +44,7 @@
 // can reasonably be made for system-wide shutdown situations where even the
 // Service Manager itself will be imminently torn down.
 class COMPONENT_EXPORT(SERVICE_MANAGER_CPP) ServiceBinding
-    : public mojom::Service,
-      public mojom::ServiceFactory {
+    : public mojom::Service {
  public:
   // Creates a new ServiceBinding bound to |service|. The service will not
   // receive any Service interface calls until |Bind()| is called, but its
@@ -166,11 +165,10 @@
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe,
                        OnBindInterfaceCallback callback) override;
-
-  // mojom::ServiceFactory:
-  void CreateService(mojom::ServiceRequest request,
-                     const std::string& service_name,
-                     mojom::PIDReceiverPtr pid_Receiver) override;
+  void CreatePackagedServiceInstance(
+      const Identity& identity,
+      mojo::PendingReceiver<mojom::Service> receiver,
+      mojo::PendingRemote<mojom::ProcessMetadata> metadata) override;
 
   // The Service instance to which all incoming events from the Service Manager
   // should be directed. Typically this is the object which owns this
@@ -187,11 +185,6 @@
   Identity identity_;
   std::unique_ptr<Connector> connector_;
 
-  // TODO(https://crbug.com/952860): Remove this. Temporary until an API is
-  // added to the mojom::Service interface for creating packaged service
-  // instances.
-  mojo::BindingSet<mojom::ServiceFactory> factory_bindings_;
-
   // This instance's control interface to the service manager. Note that this
   // is unbound and therefore invalid until OnStart() is called.
   mojom::ServiceControlAssociatedPtr service_control_;
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.cc b/services/service_manager/public/cpp/test/test_connector_factory.cc
index 6dfa2981..59f8448e 100644
--- a/services/service_manager/public/cpp/test/test_connector_factory.cc
+++ b/services/service_manager/public/cpp/test/test_connector_factory.cc
@@ -79,7 +79,7 @@
   void RegisterServiceInstance(
       const Identity& identity,
       mojo::ScopedMessagePipeHandle service,
-      mojom::PIDReceiverRequest pid_receiver_request,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver,
       RegisterServiceInstanceCallback callback) override {
     NOTREACHED();
   }
diff --git a/services/service_manager/public/cpp/test/test_service_manager.cc b/services/service_manager/public/cpp/test/test_service_manager.cc
index ca72829..e938bfd 100644
--- a/services/service_manager/public/cpp/test/test_service_manager.cc
+++ b/services/service_manager/public/cpp/test/test_service_manager.cc
@@ -4,6 +4,8 @@
 
 #include "services/service_manager/public/cpp/test/test_service_manager.h"
 
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/background_service_manager.h"
 
 namespace service_manager {
@@ -25,11 +27,11 @@
 
 mojom::ServiceRequest TestServiceManager::RegisterInstance(
     const Identity& identity) {
-  mojom::ServicePtr service;
-  mojom::ServiceRequest request = mojo::MakeRequest(&service);
+  mojo::PendingRemote<mojom::Service> service;
+  auto receiver = service.InitWithNewPipeAndPassReceiver();
   background_service_manager_->RegisterService(identity, std::move(service),
-                                               nullptr);
-  return request;
+                                               mojo::NullReceiver());
+  return receiver;
 }
 
 }  // namespace service_manager
diff --git a/services/service_manager/public/mojom/BUILD.gn b/services/service_manager/public/mojom/BUILD.gn
index 2c51db2..cf653180 100644
--- a/services/service_manager/public/mojom/BUILD.gn
+++ b/services/service_manager/public/mojom/BUILD.gn
@@ -14,7 +14,6 @@
     "interface_provider_spec.mojom",
     "service.mojom",
     "service_control.mojom",
-    "service_factory.mojom",
     "service_filter.mojom",
     "service_manager.mojom",
   ]
diff --git a/services/service_manager/public/mojom/connector.mojom b/services/service_manager/public/mojom/connector.mojom
index a90f2dd..3918315 100644
--- a/services/service_manager/public/mojom/connector.mojom
+++ b/services/service_manager/public/mojom/connector.mojom
@@ -4,6 +4,7 @@
 
 module service_manager.mojom;
 
+import "mojo/public/mojom/base/process_id.mojom";
 import "mojo/public/mojom/base/token.mojom";
 import "services/service_manager/public/mojom/constants.mojom";
 import "services/service_manager/public/mojom/interface_provider.mojom";
@@ -80,11 +81,13 @@
   string sandbox_type;
 };
 
-// Implemented by an object in the service manager associated with a specific
-// instance. Tells the service manager the PID for a process launched by the
-// client.
-interface PIDReceiver {
-  SetPID(uint32 pid);
+// Implemented by an object in the Service Manager associated with a specific
+// instance. Used by privileged clients to inform the Service Manager about
+// metadata concerning a specific service process controlled by the client. See
+// |Connector.RegisterServiceInstance()| and
+// |Service.CreatePackagedServiceInstance()|.
+interface ProcessMetadata {
+  SetPID(mojo_base.mojom.ProcessId pid);
 };
 
 // An interface that allows the holder to start other services & bind to
@@ -159,8 +162,8 @@
   //
   // |service| is a |Service| interface pipe (i.e. a ServicePtr in C++).
   //
-  // |pid_receiver_request| is the receiving end of a PIDReceiver pipe. The
-  // caller is expected to call |SetPid()| on the other end of this pipe in
+  // |metadata_receiver| is the receiving end of a ProcessMetadata pipe. The
+  // caller is expected to call |SetPID()| on the other end of this pipe in
   // order to inform the Service Manager about which process is actually hosting
   // the service instance.
   //
@@ -170,8 +173,8 @@
   // message pipe.
   RegisterServiceInstance(Identity identity,
                           handle<message_pipe> service,
-                          PIDReceiver& pid_receiver_request) =>
-      (ConnectResult result);
+                          pending_receiver<ProcessMetadata>? metadata_receiver)
+      => (ConnectResult result);
 
   // Binds another Connector pipe to this same implementation. This effectively
   // allows the client to "clone" its Connector arbitrarily many times, for
diff --git a/services/service_manager/public/mojom/service.mojom b/services/service_manager/public/mojom/service.mojom
index 77f3ba1..403e4dc 100644
--- a/services/service_manager/public/mojom/service.mojom
+++ b/services/service_manager/public/mojom/service.mojom
@@ -4,6 +4,7 @@
 
 module service_manager.mojom;
 
+import "mojo/public/mojom/base/process_id.mojom";
 import "services/service_manager/public/mojom/connector.mojom";
 import "services/service_manager/public/mojom/interface_provider.mojom";
 import "services/service_manager/public/mojom/interface_provider_spec.mojom";
@@ -72,4 +73,16 @@
   OnBindInterface(BindSourceInfo source,
                   string interface_name,
                   handle<message_pipe> interface_pipe) => ();
+
+  // Requests that the service initialize a new instance of the service
+  // identified by |identity|. The identified service will always be a service
+  // packaged by the service receiving this request, according to its manifest.
+  //
+  // |receiver| should be bound to a Service implementation for the new service
+  // instance. |metadata| should be used to submit information (like PID) about
+  // the process running the new service instance if different from the
+  // packaging service's own process.
+  CreatePackagedServiceInstance(Identity identity,
+                                pending_receiver<Service> receiver,
+                                pending_remote<ProcessMetadata> metadata);
 };
diff --git a/services/service_manager/public/mojom/service_factory.mojom b/services/service_manager/public/mojom/service_factory.mojom
deleted file mode 100644
index a62e1ae..0000000
--- a/services/service_manager/public/mojom/service_factory.mojom
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module service_manager.mojom;
-
-import "services/service_manager/public/mojom/connector.mojom";
-import "services/service_manager/public/mojom/service.mojom";
-
-// Implemented by a package containing multiple services identified by
-// unique names.
-interface ServiceFactory {
-  // Sent by the Service Manager to delegate the creation of a new instance of
-  // service |name|. |service| is the Service pipe to which the new instance
-  // should bind.
-  //
-  // The ServiceFactory implementation should use |pid_receiver| to communicate
-  // the PID of the process in which the new service instance is running.
-  CreateService(Service& service, string name, PIDReceiver pid_receiver);
-};
diff --git a/services/service_manager/sandbox/mac/gpu_v2.sb b/services/service_manager/sandbox/mac/gpu_v2.sb
index af09bab8..c0bf7e9 100644
--- a/services/service_manager/sandbox/mac/gpu_v2.sb
+++ b/services/service_manager/sandbox/mac/gpu_v2.sb
@@ -17,6 +17,9 @@
   (global-name "com.apple.gpumemd.source")
   (global-name "com.apple.lsd.mapdb")
   (global-name "com.apple.lsd.modifydb")
+  (global-name "com.apple.powerlog.plxpclogger.xpc")
+  (global-name "com.apple.PowerManagement.control")
+  (global-name "com.apple.SecurityServer")
   (global-name "com.apple.system.notification_center")
   (global-name "com.apple.tsm.uiserver")
   (global-name "com.apple.windowserver.active")
@@ -85,7 +88,3 @@
   (subpath "/Library/Video/Plug-Ins")
   (subpath "/System/Library/Video/Plug-Ins")
 )
-
-; A temporary test to diagnose a hang.
-(if (string=? (param bundle-id) "com.google.Chrome.canary")
-  (allow mach-lookup))
diff --git a/services/service_manager/service_instance.cc b/services/service_manager/service_instance.cc
index dcb5078..48af8bb 100644
--- a/services/service_manager/service_instance.cc
+++ b/services/service_manager/service_instance.cc
@@ -205,21 +205,29 @@
     Stop();
 }
 
+void ServiceInstance::SetPID(base::ProcessId pid) {
+#if !defined(OS_IOS)
+  // iOS does not support base::Process and simply passes 0 here, so elide
+  // this check on that platform.
+  if (pid == base::kNullProcessId) {
+    // Destroys |this|.
+    service_manager_->DestroyInstance(this);
+    return;
+  }
+#endif
+  pid_ = pid;
+  MaybeNotifyPidAvailable();
+}
+
 void ServiceInstance::StartWithRemote(
-    mojo::PendingRemote<mojom::Service> remote,
-    mojo::PendingReceiver<mojom::PIDReceiver> pid_receiver) {
+    mojo::PendingRemote<mojom::Service> remote) {
   DCHECK(!service_remote_);
-
-  if (pid_receiver)
-    pid_receiver_receiver_.Bind(std::move(pid_receiver));
-
   service_remote_.Bind(std::move(remote));
   service_remote_.set_disconnect_handler(base::BindOnce(
       &ServiceInstance::OnServiceDisconnected, base::Unretained(this)));
   service_remote_->OnStart(identity_,
                            base::BindOnce(&ServiceInstance::OnStartCompleted,
                                           base::Unretained(this)));
-
   service_manager_->NotifyServiceCreated(*this);
 }
 
@@ -237,15 +245,19 @@
   if (!process_launcher_)
     return false;
   // TODO(tsepez): use actual sandbox type. https://crbug.com/788778
-  mojom::ServicePtr service =
-      process_launcher_->Start(identity_, SANDBOX_TYPE_NO_SANDBOX,
-                               base::BindOnce(&ServiceInstance::set_pid,
-                                              weak_ptr_factory_.GetWeakPtr()));
-  StartWithRemote(service.PassInterface(), mojo::NullReceiver());
+  mojom::ServicePtr service = process_launcher_->Start(
+      identity_, SANDBOX_TYPE_NO_SANDBOX,
+      base::BindOnce(&ServiceInstance::SetPID, weak_ptr_factory_.GetWeakPtr()));
+  StartWithRemote(service.PassInterface());
   return true;
 #endif
 }
 
+void ServiceInstance::BindProcessMetadataReceiver(
+    mojo::PendingReceiver<mojom::ProcessMetadata> receiver) {
+  process_metadata_receiver_.Bind(std::move(receiver));
+}
+
 bool ServiceInstance::MaybeAcceptConnectionRequest(
     const ServiceInstance& source_instance,
     const std::string& interface_name,
@@ -284,6 +296,17 @@
   return true;
 }
 
+bool ServiceInstance::CreatePackagedServiceInstance(
+    const Identity& packaged_instance_identity,
+    mojo::PendingReceiver<mojom::Service> receiver,
+    mojo::PendingRemote<mojom::ProcessMetadata> metadata) {
+  if (!service_remote_)
+    return false;
+  service_remote_->CreatePackagedServiceInstance(
+      packaged_instance_identity, std::move(receiver), std::move(metadata));
+  return true;
+}
+
 void ServiceInstance::Stop() {
   DCHECK(!stopped_);
 
@@ -291,7 +314,7 @@
   // observe disconnection of its corresponding Service receiver and react by
   // self-terminating ASAP.
   service_remote_.reset();
-  pid_receiver_receiver_.reset();
+  process_metadata_receiver_.reset();
   connector_receivers_.Clear();
   service_manager_receivers_.Clear();
   MarkUnreachable();
@@ -487,7 +510,7 @@
 void ServiceInstance::RegisterServiceInstance(
     const Identity& identity,
     mojo::ScopedMessagePipeHandle service_remote_handle,
-    mojom::PIDReceiverRequest pid_receiver_request,
+    mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver,
     RegisterServiceInstanceCallback callback) {
   auto target_filter = ServiceFilter::ForExactIdentity(identity);
   if (!CanConnectToOtherInstance(target_filter,
@@ -514,9 +537,8 @@
     return;
   }
 
-  mojom::ServicePtr service(std::move(service_remote));
-  if (!service_manager_->RegisterService(identity, std::move(service),
-                                         std::move(pid_receiver_request))) {
+  if (!service_manager_->RegisterService(identity, std::move(service_remote),
+                                         std::move(metadata_receiver))) {
     std::move(callback).Run(mojom::ConnectResult::ACCESS_DENIED);
   }
 
@@ -537,20 +559,6 @@
       target.PassInterface(), std::move(source_request)));
 }
 
-void ServiceInstance::SetPID(uint32_t pid) {
-#if !defined(OS_IOS)
-  // iOS does not support base::Process and simply passes 0 here, so elide
-  // this check on that platform.
-  if (pid == base::kNullProcessId) {
-    // Destroys |this|.
-    service_manager_->DestroyInstance(this);
-    return;
-  }
-#endif
-  pid_ = pid;
-  MaybeNotifyPidAvailable();
-}
-
 void ServiceInstance::RequestQuit() {
   // Ignore quit requests when there are in-flight connection requests that the
   // instance hasn't acknowledged yet.
diff --git a/services/service_manager/service_instance.h b/services/service_manager/service_instance.h
index 039753e6..2e7f0d7 100644
--- a/services/service_manager/service_instance.h
+++ b/services/service_manager/service_instance.h
@@ -20,6 +20,7 @@
 #include "base/process/process_handle.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -42,7 +43,7 @@
 // corresponding ServiceInstance object in the Service Manager, dedicated to
 // that instance.
 class ServiceInstance : public mojom::Connector,
-                        public mojom::PIDReceiver,
+                        public mojom::ProcessMetadata,
                         public mojom::ServiceControl,
                         public mojom::ServiceManager {
  public:
@@ -55,24 +56,21 @@
   const Identity& identity() const { return identity_; }
   const Manifest& manifest() const { return manifest_; }
 
-  // Overrides the Identity set at construction time.
-  void set_identity(const Identity& identity) {
-    DCHECK(identity.IsValid());
-    identity_ = identity;
-  }
-
-  // Sets the PID explicitly for this instance rather than waiting for a PID
-  // from a bound PIDReceiver endpoint.
-  void set_pid(base::ProcessId pid) { pid_ = pid; }
+  // mojom::ProcessMetadata:
+  void SetPID(base::ProcessId pid) override;
 
   // Starts this instance using an already-established Service pipe.
-  void StartWithRemote(mojo::PendingRemote<mojom::Service> remote,
-                       mojo::PendingReceiver<mojom::PIDReceiver> pid_receiver);
+  void StartWithRemote(mojo::PendingRemote<mojom::Service> remote);
 
   // Starts this instance from a path to a service executable on disk.
   bool StartWithExecutablePath(const base::FilePath& path,
                                SandboxType sandbox_type);
 
+  // Binds an endpoint for this instance to receive metadata about its
+  // corresponding service process, if any.
+  void BindProcessMetadataReceiver(
+      mojo::PendingReceiver<mojom::ProcessMetadata> receiver);
+
   // Forwards a BindInterface request from |source_instance| to this instance,
   // iff it should be allowed based on manifest constraints. Returns |true| if
   // the request was allowed, or |false| otherwise.
@@ -82,6 +80,14 @@
       mojo::ScopedMessagePipeHandle receiving_pipe,
       mojom::BindInterfacePriority priority);
 
+  // Asks this service instance to bind a new concrete service implementation
+  // for |packaged_instance_identity|. The packaged instance will always
+  // correspond to a service packaged in this service's manifest.
+  bool CreatePackagedServiceInstance(
+      const Identity& packaged_instance_identity,
+      mojo::PendingReceiver<mojom::Service> receiver,
+      mojo::PendingRemote<mojom::ProcessMetadata> metadata);
+
   // Stops receiving any new messages from the service instance and renders the
   // instance permanently unreachable. Note that this does NOT make any attempt
   // to join the service instance's process if any exists.
@@ -133,7 +139,7 @@
   void RegisterServiceInstance(
       const Identity& identity,
       mojo::ScopedMessagePipeHandle service_remote_handle,
-      mojom::PIDReceiverRequest pid_receiver_request,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver,
       RegisterServiceInstanceCallback callback) override;
   void Clone(mojom::ConnectorRequest request) override;
   void FilterInterfaces(const std::string& filter_name,
@@ -141,9 +147,6 @@
                         mojom::InterfaceProviderRequest source_request,
                         mojom::InterfaceProviderPtr target) override;
 
-  // mojom::PIDReceiver:
-  void SetPID(uint32_t pid) override;
-
   // mojom::ServiceControl:
   void RequestQuit() override;
 
@@ -155,7 +158,7 @@
 
   // A unique identity for this instance. Distinct from PID, as a single process
   // may host multiple service instances. Globally unique across time and space.
-  Identity identity_;
+  const Identity identity_;
 
   // The static service manifest provided for this service at system
   // initialization time.
@@ -175,7 +178,7 @@
   // Receivers for the various interfaces implemented by this object. These all
   // receive calls directly from the service instance itself or some trusted
   // representative thereof.
-  mojo::Receiver<mojom::PIDReceiver> pid_receiver_receiver_{this};
+  mojo::Receiver<mojom::ProcessMetadata> process_metadata_receiver_{this};
   mojo::ReceiverSet<mojom::Connector> connector_receivers_;
   mojo::ReceiverSet<mojom::ServiceManager> service_manager_receivers_;
   mojo::AssociatedReceiver<mojom::ServiceControl> control_receiver_{this};
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
index b6e3f929..09d6829 100644
--- a/services/service_manager/service_manager.cc
+++ b/services/service_manager/service_manager.cc
@@ -79,17 +79,14 @@
                            .Build())
           .ExposeCapability(kCapability_ServiceManager,
                             Manifest::InterfaceList<mojom::ServiceManager>())
-          .WithInterfacesBindableOnAnyService(
-              service_manager::Manifest::InterfaceList<mojom::ServiceFactory>())
           .Build();
   service_manager_instance_ = CreateServiceInstance(
       GetServiceManagerInstanceIdentity(), service_manager_manifest);
-  service_manager_instance_->set_pid(GetCurrentPid());
+  service_manager_instance_->SetPID(GetCurrentPid());
 
   mojo::PendingRemote<mojom::Service> remote;
   service_binding_.Bind(remote.InitWithNewPipeAndPassReceiver());
-  service_manager_instance_->StartWithRemote(std::move(remote),
-                                             mojo::NullReceiver());
+  service_manager_instance_->StartWithRemote(std::move(remote));
 }
 
 ServiceManager::~ServiceManager() {
@@ -121,18 +118,29 @@
   TRACE_EVENT_INSTANT1("service_manager", "ServiceManager::Connect",
                        TRACE_EVENT_SCOPE_THREAD, "original_name",
                        partial_target_filter.service_name());
+  if (partial_target_filter.service_name() == mojom::kServiceName)
+    return service_manager_instance_;
 
-  const Identity& source_identity = source_instance.identity();
-  ServiceFilter target_filter = partial_target_filter;
+  const service_manager::Manifest* manifest =
+      catalog_.GetManifest(partial_target_filter.service_name());
+  if (!manifest) {
+    LOG(ERROR) << "Failed to resolve service name: "
+               << partial_target_filter.service_name();
+    return nullptr;
+  }
 
-  // If the target filter does not specify an instance group, we assume the
-  // source's own.
-  if (!target_filter.instance_group())
-    target_filter.set_instance_group(source_identity.instance_group());
-
-  // If the target filter does not specify an instance ID, we assume zero.
-  if (!target_filter.instance_id())
+  service_manager::ServiceFilter target_filter = partial_target_filter;
+  if (!target_filter.instance_group()) {
+    // Inherit the source instance's group if none was specified by the
+    // caller's provided filter.
+    target_filter.set_instance_group(
+        source_instance.identity().instance_group());
+  }
+  if (!target_filter.instance_id()) {
+    // Assume the default (zero) instance ID if none was specified by the
+    // caller's provided filter.
     target_filter.set_instance_id(base::Token());
+  }
 
   // Use an existing instance if possible.
   ServiceInstance* target_instance =
@@ -140,86 +148,64 @@
   if (target_instance)
     return target_instance;
 
-  const service_manager::Manifest* manifest =
-      catalog_.GetManifest(target_filter.service_name());
-  if (!manifest) {
-    LOG(ERROR) << "Failed to resolve service name: "
-               << target_filter.service_name();
-    return nullptr;
-  }
-
   // If there was no existing instance but the caller is requesting a specific
   // globally unique ID for the target, ignore the request. That instance is
   // obviously no longer running, and globally unique IDs are never reused.
   if (target_filter.globally_unique_id())
     return nullptr;
 
-  Identity new_instance_identity;
-  if (manifest->options.instance_sharing_policy ==
-      Manifest::InstanceSharingPolicy::kSingleton) {
-    // For singleton instances, we generate a random group ID along with the
-    // random GUID.
-    new_instance_identity =
-        Identity(target_filter.service_name(), base::Token::CreateRandom(),
-                 base::Token{}, base::Token::CreateRandom());
-  } else if (manifest->options.instance_sharing_policy ==
-             Manifest::InstanceSharingPolicy::kSharedAcrossGroups) {
-    // Services that use |kSharedAcrossGroups| sharing policy are allowed to
-    // match ServiceFilters targeting any instance group. They run with a
-    // random group ID generated here, and the group provided by |target_filter|
-    // is ignored. The instance ID from |target_filter| is still used.
-    new_instance_identity =
-        Identity(target_filter.service_name(), base::Token::CreateRandom(),
-                 *target_filter.instance_id(), base::Token::CreateRandom());
-  } else {
-    DCHECK_EQ(manifest->options.instance_sharing_policy,
-              Manifest::InstanceSharingPolicy::kNoSharing);
-    new_instance_identity =
-        Identity(target_filter.service_name(), *target_filter.instance_group(),
-                 *target_filter.instance_id(), base::Token::CreateRandom());
-  }
-
-  DCHECK(!target_instance);
-  target_instance = CreateServiceInstance(new_instance_identity, *manifest);
-
   const service_manager::Manifest* parent_manifest =
       catalog_.GetParentManifest(manifest->service_name);
-  if (parent_manifest) {
-    // This service is provided by another service via a ServiceFactory.
-    //
-    // We normally ignore the target instance group and generate a unique
-    // instance group identifier when starting shared instances, but when those
-    // instances need to be started by a service factory, it's conceivable that
-    // the factory itself may be part of the originally targeted instance group.
-    // In that case we use the originally targeted instance group to identify
-    // the factory service.
-    //
-    // TODO(https://crbug.com/904240): This is super weird and hard to
-    // rationalize. Maybe it's the wrong thing to do.
-    target_instance->set_identity(
-        Identity(new_instance_identity.name(), *target_filter.instance_group(),
-                 new_instance_identity.instance_id(),
-                 new_instance_identity.globally_unique_id()));
 
+  // New instances to be shared globally or across instance groups are assigned
+  // their own random instance group. Packaged service instances also retain
+  // the target filter group regardless of sharing policy.
+  const base::Token target_group =
+      manifest->options.instance_sharing_policy ==
+                  Manifest::InstanceSharingPolicy::kNoSharing ||
+              parent_manifest
+          ? *target_filter.instance_group()
+          : base::Token::CreateRandom();
+
+  // New singleton instances are always forced to instance ID zero.
+  const base::Token target_instance_id =
+      manifest->options.instance_sharing_policy ==
+              Manifest::InstanceSharingPolicy::kSingleton
+          ? base::Token()
+          : *target_filter.instance_id();
+
+  DCHECK(!target_instance);
+  target_instance = CreateServiceInstance(
+      Identity(target_filter.service_name(), target_group, target_instance_id,
+               target_filter.globally_unique_id().value_or(
+                   base::Token::CreateRandom())),
+      *manifest);
+
+  if (parent_manifest) {
+    // This service is provided by another service, as indicated by the
+    // providing service's manifest. Get an instance of that service first, and
+    // ask it to create an instance of this one.
     auto factory_filter = ServiceFilter::ByNameWithIdInGroup(
         parent_manifest->service_name, *target_filter.instance_id(),
         *target_filter.instance_group());
+    ServiceInstance* factory_instance = FindOrCreateMatchingTargetInstance(
+        *service_manager_instance_, factory_filter);
 
-    mojom::PIDReceiverPtr pid_receiver;
-    auto pid_receiver_request = mojo::MakeRequest(&pid_receiver);
-
+    mojo::PendingRemote<mojom::ProcessMetadata> metadata;
+    auto metadata_receiver = metadata.InitWithNewPipeAndPassReceiver();
     mojo::PendingRemote<mojom::Service> remote;
-    auto* factory = GetServiceFactory(factory_filter);
-    if (!factory) {
+    bool created =
+        factory_instance &&
+        factory_instance->CreatePackagedServiceInstance(
+            target_instance->identity(),
+            remote.InitWithNewPipeAndPassReceiver(), std::move(metadata));
+    if (!created) {
       DestroyInstance(target_instance);
       return nullptr;
     }
 
-    factory->CreateService(remote.InitWithNewPipeAndPassReceiver(),
-                           target_filter.service_name(),
-                           std::move(pid_receiver));
-    target_instance->StartWithRemote(std::move(remote),
-                                     std::move(pid_receiver_request));
+    target_instance->BindProcessMetadataReceiver(std::move(metadata_receiver));
+    target_instance->StartWithRemote(std::move(remote));
   } else {
     base::FilePath service_exe_root;
     CHECK(base::PathService::Get(base::DIR_ASSETS, &service_exe_root));
@@ -253,8 +239,8 @@
 
 bool ServiceManager::RegisterService(
     const Identity& identity,
-    mojom::ServicePtr service,
-    mojom::PIDReceiverRequest pid_receiver_request) {
+    mojo::PendingRemote<mojom::Service> service,
+    mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver) {
   if (!identity.IsValid())
     return false;
 
@@ -265,15 +251,12 @@
     return false;
   }
 
-  if (!pid_receiver_request.is_pending()) {
-    mojo::Remote<mojom::PIDReceiver> pid_receiver;
-    pid_receiver_request = pid_receiver.BindNewPipeAndPassReceiver();
-    pid_receiver->SetPID(GetCurrentPid());
-  }
-
   ServiceInstance* instance = CreateServiceInstance(identity, *manifest);
-  instance->StartWithRemote(service.PassInterface(),
-                            std::move(pid_receiver_request));
+  if (metadata_receiver)
+    instance->BindProcessMetadataReceiver(std::move(metadata_receiver));
+  else
+    instance->SetPID(GetCurrentPid());
+  instance->StartWithRemote(std::move(service));
   return true;
 }
 
@@ -364,37 +347,6 @@
   listeners_.AddPtr(std::move(listener));
 }
 
-mojom::ServiceFactory* ServiceManager::GetServiceFactory(
-    const ServiceFilter& filter) {
-  auto it = service_factories_.find(filter);
-  if (it != service_factories_.end())
-    return it->second.get();
-
-  mojom::ServiceFactoryPtr factory;
-  ServiceInstance* factory_instance =
-      FindOrCreateMatchingTargetInstance(*service_manager_instance_, filter);
-  if (!factory_instance)
-    return nullptr;
-
-  factory_instance->MaybeAcceptConnectionRequest(
-      *service_manager_instance_, mojom::ServiceFactory::Name_,
-      mojo::MakeRequest(&factory).PassMessagePipe(),
-      mojom::BindInterfacePriority::kImportant);
-
-  mojom::ServiceFactory* factory_interface = factory.get();
-  factory.set_connection_error_handler(base::BindOnce(
-      &ServiceManager::OnServiceFactoryLost, base::Unretained(this), filter));
-  service_factories_[filter] = std::move(factory);
-  return factory_interface;
-}
-
-void ServiceManager::OnServiceFactoryLost(const ServiceFilter& which) {
-  // Remove the mapping.
-  auto it = service_factories_.find(which);
-  DCHECK(it != service_factories_.end());
-  service_factories_.erase(it);
-}
-
 void ServiceManager::OnBindInterface(
     const BindSourceInfo& source_info,
     const std::string& interface_name,
diff --git a/services/service_manager/service_manager.h b/services/service_manager/service_manager.h
index c63dcfc..f48d26d7 100644
--- a/services/service_manager/service_manager.h
+++ b/services/service_manager/service_manager.h
@@ -5,7 +5,6 @@
 #ifndef SERVICES_SERVICE_MANAGER_SERVICE_MANAGER_H_
 #define SERVICES_SERVICE_MANAGER_SERVICE_MANAGER_H_
 
-#include <map>
 #include <memory>
 #include <set>
 #include <vector>
@@ -16,6 +15,8 @@
 #include "base/process/process.h"
 #include "base/token.h"
 #include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/catalog.h"
 #include "services/service_manager/public/cpp/identity.h"
 #include "services/service_manager/public/cpp/manifest.h"
@@ -24,7 +25,6 @@
 #include "services/service_manager/public/mojom/connector.mojom.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "services/service_manager/public/mojom/service_manager.mojom.h"
 #include "services/service_manager/service_instance_registry.h"
 #include "services/service_manager/service_process_launcher_factory.h"
@@ -62,13 +62,14 @@
   // Service Manager's embedder to register instances directly, without
   // requiring a Connector.
   //
-  // |pid_receiver_request| may be null, in which case the service manager
-  // assumes the new service is running in this process.
+  // |metadata_receiver| may be null, in which case the Service Manager assumes
+  // the new service is running in the calling process.
   //
   // Returns |true| if registration succeeded, or |false| otherwise.
-  bool RegisterService(const Identity& identity,
-                       mojom::ServicePtr service,
-                       mojom::PIDReceiverRequest pid_receiver_request);
+  bool RegisterService(
+      const Identity& identity,
+      mojo::PendingRemote<mojom::Service> service,
+      mojo::PendingReceiver<mojom::ProcessMetadata> metadata_receiver);
 
   // Determine information about |service_name| from its manifests. Returns
   // false if the identity does not have a catalog entry.
@@ -77,8 +78,8 @@
                     std::string* sandbox_type);
 
   // Attempts to locate a ServiceInstance as a target for a connection request
-  // from |source_instance| by matching against |partial_target_filter|. If
-  // a suitable instance exists it is returned, otherwise the Service Manager
+  // from |source_instance| by matching against |partial_target_filter|. If a
+  // suitable instance exists it is returned, otherwise the Service Manager
   // attempts to create a new suitable instance.
   //
   // Returns null if a matching instance did not exist and could not be created,
@@ -120,11 +121,6 @@
   // Called from the instance implementing mojom::ServiceManager.
   void AddListener(mojom::ServiceManagerListenerPtr listener);
 
-  // Returns a running ServiceFactory for |filter|. If there is not one running,
-  // one is started.
-  mojom::ServiceFactory* GetServiceFactory(const ServiceFilter& filter);
-  void OnServiceFactoryLost(const ServiceFilter& which);
-
   // Service:
   void OnBindInterface(const BindSourceInfo& source_info,
                        const std::string& interface_name,
@@ -147,7 +143,6 @@
   // ServiceInstance still has an entry in |instances_|.
   ServiceInstance* service_manager_instance_;
 
-  std::map<ServiceFilter, mojom::ServiceFactoryPtr> service_factories_;
   mojo::InterfacePtrSet<mojom::ServiceManagerListener> listeners_;
   base::Callback<void(const Identity&)> instance_quit_callback_;
   std::unique_ptr<ServiceProcessLauncherFactory>
diff --git a/services/service_manager/service_process_launcher.h b/services/service_manager/service_process_launcher.h
index 50b968dac..12ad886 100644
--- a/services/service_manager/service_process_launcher.h
+++ b/services/service_manager/service_process_launcher.h
@@ -15,7 +15,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/process/process.h"
 #include "base/sequenced_task_runner.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/sandbox/sandbox_type.h"
 #include "services/service_manager/service_process_launcher_delegate.h"
 
diff --git a/services/service_manager/tests/background_service_manager_unittest.cc b/services/service_manager/tests/background_service_manager_unittest.cc
index e651f6d2..60ad807 100644
--- a/services/service_manager/tests/background_service_manager_unittest.cc
+++ b/services/service_manager/tests/background_service_manager_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/values.h"
 #include "build/build_config.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/manifest.h"
@@ -82,7 +83,7 @@
   background_service_manager.RegisterService(
       Identity(kTestName, kSystemInstanceGroup, base::Token{},
                base::Token::CreateRandom()),
-      std::move(service), nullptr);
+      service.PassInterface(), mojo::NullReceiver() /* metadata_receiver */);
 
   mojom::TestServicePtr test_service;
   service_impl.connector()->BindInterface(ServiceFilter::ByName(kAppName),
diff --git a/services/service_manager/tests/service_manager/service_manager_listener_unittest.cc b/services/service_manager/tests/service_manager/service_manager_listener_unittest.cc
index 6927e6c8..8bfbc5a6 100644
--- a/services/service_manager/tests/service_manager/service_manager_listener_unittest.cc
+++ b/services/service_manager/tests/service_manager/service_manager_listener_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/service.h"
@@ -125,15 +126,15 @@
 
   mojom::ServiceRequest RegisterServiceInstance(const std::string& service_name,
                                                 uint32_t fake_pid) {
-    mojom::ServicePtr proxy;
-    mojom::ServiceRequest request = mojo::MakeRequest(&proxy);
-    mojom::PIDReceiverPtr pid_receiver;
+    mojo::PendingRemote<mojom::Service> service;
+    auto receiver = service.InitWithNewPipeAndPassReceiver();
+    mojo::Remote<mojom::ProcessMetadata> metadata;
     service_manager_.RegisterService(
         Identity(service_name, kSystemInstanceGroup, base::Token{},
                  base::Token::CreateRandom()),
-        std::move(proxy), mojo::MakeRequest(&pid_receiver));
-    pid_receiver->SetPID(fake_pid);
-    return request;
+        std::move(service), metadata.BindNewPipeAndPassReceiver());
+    metadata->SetPID(fake_pid);
+    return receiver;
   }
 
   void WaitForServiceStarted(Identity* out_identity, uint32_t* out_pid) {
diff --git a/services/service_manager/tests/service_manager/service_manager_unittest.cc b/services/service_manager/tests/service_manager/service_manager_unittest.cc
index 5a0c78c..4aa1009 100644
--- a/services/service_manager/tests/service_manager/service_manager_unittest.cc
+++ b/services/service_manager/tests/service_manager/service_manager_unittest.cc
@@ -24,6 +24,7 @@
 #include "base/token.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 #include "mojo/public/cpp/system/invitation.h"
@@ -267,16 +268,16 @@
     service_manager::mojom::ServicePtr client =
         ServiceProcessLauncher::PassServiceRequestOnCommandLine(
             &invitation, &child_command_line);
-    service_manager::mojom::PIDReceiverPtr receiver;
+    mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
     connector()->RegisterServiceInstance(
         service_manager::Identity(kTestTargetName, kSystemInstanceGroup,
                                   base::Token{}, base::Token::CreateRandom()),
-        std::move(client), mojo::MakeRequest(&receiver));
+        client.PassInterface(), metadata.BindNewPipeAndPassReceiver());
 
     target_ = base::LaunchProcess(child_command_line, options);
     DCHECK(target_.IsValid());
     channel.RemoteProcessLaunchAttempted();
-    receiver->SetPID(target_.Pid());
+    metadata->SetPID(target_.Pid());
     mojo::OutgoingInvitation::Send(std::move(invitation), target_.Handle(),
                                    channel.TakeLocalEndpoint());
   }
@@ -535,11 +536,11 @@
   // |can_create_other_service_instances| set to |true| in its manifest.
   mojom::ServicePtr test_service_proxy1;
   SimpleService test_service1(mojo::MakeRequest(&test_service_proxy1));
-  mojom::PIDReceiverPtr pid_receiver1;
+  mojo::Remote<mojom::ProcessMetadata> metadata1;
   connector()->RegisterServiceInstance(kInstance1Id,
-                                       std::move(test_service_proxy1),
-                                       mojo::MakeRequest(&pid_receiver1));
-  pid_receiver1->SetPID(42);
+                                       test_service_proxy1.PassInterface(),
+                                       metadata1.BindNewPipeAndPassReceiver());
+  metadata1->SetPID(42);
   WaitForInstanceToStart(kInstance1Id);
   EXPECT_EQ(1u, instances().size());
   EXPECT_TRUE(ContainsInstanceWithName(kTestTargetName));
@@ -548,11 +549,11 @@
   // to attempt introduction of yet another instance. This should fail.
   mojom::ServicePtr test_service_proxy2;
   SimpleService test_service2(mojo::MakeRequest(&test_service_proxy2));
-  mojom::PIDReceiverPtr pid_receiver2;
+  mojo::Remote<mojom::ProcessMetadata> metadata2;
   test_service1.connector()->RegisterServiceInstance(
-      kInstance2Id, std::move(test_service_proxy2),
-      mojo::MakeRequest(&pid_receiver2));
-  pid_receiver2->SetPID(43);
+      kInstance2Id, test_service_proxy2.PassInterface(),
+      metadata2.BindNewPipeAndPassReceiver());
+  metadata2->SetPID(43);
 
   // The new service should be disconnected immediately.
   test_service2.WaitForDisconnect();
diff --git a/services/service_manager/tests/util.cc b/services/service_manager/tests/util.cc
index de1443b..3168edd3 100644
--- a/services/service_manager/tests/util.cc
+++ b/services/service_manager/tests/util.cc
@@ -17,6 +17,8 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/platform/features.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
@@ -24,7 +26,6 @@
 #include "services/service_manager/public/cpp/service_executable/switches.h"
 #include "services/service_manager/public/mojom/connector.mojom.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
-#include "services/service_manager/public/mojom/service_factory.mojom.h"
 
 namespace service_manager {
 namespace test {
@@ -70,15 +71,14 @@
   child_command_line.AppendSwitchASCII(switches::kServiceRequestAttachmentName,
                                        pipe_name);
 
-  service_manager::mojom::ServicePtr client;
-  client.Bind(mojo::InterfacePtrInfo<service_manager::mojom::Service>(
-      std::move(pipe), 0u));
-  service_manager::mojom::PIDReceiverPtr receiver;
+  mojo::Remote<service_manager::mojom::ProcessMetadata> metadata;
 
   mojom::ConnectResult result;
   base::RunLoop loop(base::RunLoop::Type::kNestableTasksAllowed);
   connector->RegisterServiceInstance(
-      target, std::move(client), MakeRequest(&receiver),
+      target,
+      mojo::PendingRemote<service_manager::mojom::Service>(std::move(pipe), 0),
+      metadata.BindNewPipeAndPassReceiver(),
       base::BindOnce(&GrabConnectResult, &loop, &result));
   loop.Run();
 
@@ -99,7 +99,7 @@
   *process = base::LaunchProcess(child_command_line, options);
   DCHECK(process->IsValid());
   channel.RemoteProcessLaunchAttempted();
-  receiver->SetPID(process->Pid());
+  metadata->SetPID(process->Pid());
   mojo::OutgoingInvitation::Send(std::move(invitation), process->Handle(),
                                  channel.TakeLocalEndpoint());
   return result;
diff --git a/services/tracing/perfetto/perfetto_service.cc b/services/tracing/perfetto/perfetto_service.cc
index f919dc5..980aec9 100644
--- a/services/tracing/perfetto/perfetto_service.cc
+++ b/services/tracing/perfetto/perfetto_service.cc
@@ -63,15 +63,6 @@
   // from threads without a MessageLoop doesn't get lost.
   service_->SetSMBScrapingEnabled(true);
   DCHECK(service_);
-
-  // Trace events emitted from the taskqueue and other places can cause the
-  // Perfetto task runner to queue tasks instead of directly posting them to the
-  // taskrunner; we start a timer to periodically flush these (rare) tasks.
-  // This is needed in addition to the timer we start in
-  // TraceEventDataSource::BeginTracing as the SharedMemoryArbiter will post
-  // tasks to the taskrunner used by the Perfetto service rather than the
-  // taskrunner used by the ProducerClient, when running in in-process mode.
-  perfetto_task_runner_.StartDeferredTasksDrainTimer();
 }
 
 PerfettoService::~PerfettoService() = default;
diff --git a/services/tracing/public/cpp/perfetto/task_runner.cc b/services/tracing/public/cpp/perfetto/task_runner.cc
index 9f6faac..ea9b7cc 100644
--- a/services/tracing/public/cpp/perfetto/task_runner.cc
+++ b/services/tracing/public/cpp/perfetto/task_runner.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/no_destructor.h"
 #include "base/task/common/checked_lock_impl.h"
+#include "base/task/common/scoped_defer_task_posting.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool/thread_pool.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -19,42 +20,6 @@
 
 namespace tracing {
 
-namespace {
-
-base::ThreadLocalBoolean* PostTaskIsBlockedForThread() {
-  static base::NoDestructor<base::ThreadLocalBoolean> post_task_is_blocked;
-  return post_task_is_blocked.get();
-}
-
-}  // namespace
-
-ScopedPerfettoPostTaskBlocker::ScopedPerfettoPostTaskBlocker(bool enable)
-    : enabled_(enable) {
-  if (enabled_) {
-    PerfettoTaskRunner::BlockPostTaskForThread();
-  } else {
-    base::internal::CheckedLockImpl::AssertNoLockHeldOnCurrentThread();
-  }
-}
-
-ScopedPerfettoPostTaskBlocker::~ScopedPerfettoPostTaskBlocker() {
-  if (enabled_) {
-    PerfettoTaskRunner::UnblockPostTaskForThread();
-  }
-}
-
-// static
-void PerfettoTaskRunner::BlockPostTaskForThread() {
-  DCHECK(!PostTaskIsBlockedForThread()->Get());
-  PostTaskIsBlockedForThread()->Set(true);
-}
-
-// static
-void PerfettoTaskRunner::UnblockPostTaskForThread() {
-  DCHECK(PostTaskIsBlockedForThread()->Get());
-  PostTaskIsBlockedForThread()->Set(false);
-}
-
 PerfettoTaskRunner::PerfettoTaskRunner(
     scoped_refptr<base::SequencedTaskRunner> task_runner)
     : task_runner_(std::move(task_runner)) {}
@@ -62,45 +27,25 @@
 PerfettoTaskRunner::~PerfettoTaskRunner() = default;
 
 void PerfettoTaskRunner::PostTask(std::function<void()> task) {
-  // If we're blocked from PostTasking, we defer the task until
-  // later. If we're not blocked, but there's tasks that have previously been
-  // deferred, we PostTask them now; this is important to preserve ordering,
-  // in case the previously deferred tasks have been posted from the same
-  // sequence as we're now posting a new task from.
-  {
-    base::AutoLock lock(lock_);
-    if (!base::ThreadPool::GetInstance() ||
-        PostTaskIsBlockedForThread()->Get()) {
-      deferred_tasks_.emplace_back(std::move(task));
-      return;
-    }
-
-    while (!deferred_tasks_.empty()) {
-      GetOrCreateTaskRunner()->PostTask(
-          FROM_HERE, base::BindOnce([](std::function<void()> task) { task(); },
-                                    deferred_tasks_.front()));
-      deferred_tasks_.pop_front();
-    }
-  }
-
-  GetOrCreateTaskRunner()->PostTask(
-      FROM_HERE, base::BindOnce(
-                     [](std::function<void()> task) {
-                       // We block any trace events that happens while any
-                       // Perfetto task is running, or we'll get deadlocks in
-                       // situations where the StartupTraceWriterRegistry tries
-                       // to bind a writer which in turn causes a PostTask where
-                       // a trace event can be emitted, which then deadlocks as
-                       // it needs a new chunk from the same StartupTraceWriter
-                       // which we're trying to bind and are keeping the lock
-                       // to.
-                       // TODO(oysteine): Try to see if we can be more selective
-                       // about this.
-                       AutoThreadLocalBoolean thread_is_in_trace_event(
-                           TraceEventDataSource::GetThreadIsInTraceEventTLS());
-                       task();
-                     },
-                     task));
+  base::ScopedDeferTaskPosting::PostOrDefer(
+      GetOrCreateTaskRunner(), FROM_HERE,
+      base::BindOnce(
+          [](std::function<void()> task) {
+            // We block any trace events that happens while any
+            // Perfetto task is running, or we'll get deadlocks in
+            // situations where the StartupTraceWriterRegistry tries
+            // to bind a writer which in turn causes a PostTask where
+            // a trace event can be emitted, which then deadlocks as
+            // it needs a new chunk from the same StartupTraceWriter
+            // which we're trying to bind and are keeping the lock
+            // to.
+            // TODO(oysteine): Try to see if we can be more selective
+            // about this.
+            AutoThreadLocalBoolean thread_is_in_trace_event(
+                TraceEventDataSource::GetThreadIsInTraceEventTLS());
+            task();
+          },
+          task));
 }
 
 void PerfettoTaskRunner::PostDelayedTask(std::function<void()> task,
@@ -113,7 +58,7 @@
   // There's currently nothing which uses PostDelayedTask on the ProducerClient
   // side, where PostTask sometimes requires blocking. If this DCHECK ever
   // triggers, support for deferring delayed tasks need to be added.
-  DCHECK(!PostTaskIsBlockedForThread()->Get());
+  DCHECK(!base::ScopedDeferTaskPosting::IsPresent());
   GetOrCreateTaskRunner()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce([](std::function<void()> task) { task(); }, task),
@@ -138,36 +83,6 @@
   task_runner_ = std::move(task_runner);
 }
 
-void PerfettoTaskRunner::StartDeferredTasksDrainTimer() {
-  DCHECK(!PostTaskIsBlockedForThread()->Get());
-  // The deferred tasks will generally be posted by another task being
-  // posted when PostTask isn't blocked; this timer is a fallback for the
-  // rare case where we're *only* getting trace events when PostTask is
-  // blocked, and hence doesn't need to run very often (just often enough so
-  // the SMB doesn't get filled up with uncommitted chunks).
-  deferred_tasks_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), this,
-                              &PerfettoTaskRunner::OnDeferredTasksDrainTimer);
-}
-
-void PerfettoTaskRunner::StopDeferredTasksDrainTimer() {
-  DCHECK(!PostTaskIsBlockedForThread()->Get());
-
-  deferred_tasks_timer_.Stop();
-  OnDeferredTasksDrainTimer();
-}
-
-void PerfettoTaskRunner::OnDeferredTasksDrainTimer() {
-  DCHECK(!PostTaskIsBlockedForThread()->Get());
-
-  base::AutoLock lock(lock_);
-  while (!deferred_tasks_.empty()) {
-    task_runner_->PostTask(
-        FROM_HERE, base::BindOnce([](std::function<void()> task) { task(); },
-                                  deferred_tasks_.front()));
-    deferred_tasks_.pop_front();
-  }
-}
-
 void PerfettoTaskRunner::SetTaskRunner(
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
   DCHECK(!task_runner_);
diff --git a/services/tracing/public/cpp/perfetto/task_runner.h b/services/tracing/public/cpp/perfetto/task_runner.h
index 76e91ad..020bfda52 100644
--- a/services/tracing/public/cpp/perfetto/task_runner.h
+++ b/services/tracing/public/cpp/perfetto/task_runner.h
@@ -17,15 +17,6 @@
 
 namespace tracing {
 
-class COMPONENT_EXPORT(TRACING_CPP) ScopedPerfettoPostTaskBlocker {
- public:
-  explicit ScopedPerfettoPostTaskBlocker(bool enable);
-  ~ScopedPerfettoPostTaskBlocker();
-
- private:
-  const bool enabled_;
-};
-
 // This wraps a base::TaskRunner implementation to be able
 // to provide it to Perfetto.
 class COMPONENT_EXPORT(TRACING_CPP) PerfettoTaskRunner
@@ -58,25 +49,11 @@
   void ResetTaskRunnerForTesting(
       scoped_refptr<base::SequencedTaskRunner> task_runner);
 
-  // Sometimes we have to temporarily defer any posted tasks, like
-  // when trace events are added when the taskqueue is locked. For this purpose
-  // we keep a timer running when tracing is enabled, which will periodically
-  // drain these posted tasks.
-  void StartDeferredTasksDrainTimer();
-  void StopDeferredTasksDrainTimer();
-
-  static void BlockPostTaskForThread();
-  static void UnblockPostTaskForThread();
-
  private:
   void OnDeferredTasksDrainTimer();
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
-  base::Lock lock_;  // Protects deferred_tasks_;
-  std::list<std::function<void()>> deferred_tasks_;
-  base::RepeatingTimer deferred_tasks_timer_;
-
   DISALLOW_COPY_AND_ASSIGN(PerfettoTaskRunner);
 };
 
diff --git a/services/tracing/public/cpp/perfetto/task_runner_unittest.cc b/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
index 39e8318f..d0af6fe 100644
--- a/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
+++ b/services/tracing/public/cpp/perfetto/task_runner_unittest.cc
@@ -72,8 +72,6 @@
   void BeforeJoin() override {}
 
   void Run() override {
-    task_runner_->BlockPostTaskForThread();
-
     for (int i = 0; i < n_; ++i) {
       auto weak_ptr = weak_ptr_;
       auto sequence_number = sequence_number_;
@@ -81,8 +79,6 @@
         weak_ptr->TestTask(i, sequence_number);
       });
     }
-
-    task_runner_->UnblockPostTaskForThread();
   }
 
  private:
@@ -132,71 +128,6 @@
   wait_for_tasks.Run();
 }
 
-TEST_F(PerfettoTaskRunnerTest, SequentialDeferredTasks) {
-  base::RunLoop wait_for_tasks;
-  SetTaskExpectations(wait_for_tasks.QuitClosure(), 3);
-
-  auto weak_ptr = destination()->GetWeakPtr();
-  {
-    ScopedPerfettoPostTaskBlocker block(true);
-    task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(1); });
-    task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(2); });
-    base::RunLoop().RunUntilIdle();
-    EXPECT_EQ(0u, destination()->tasks_run());
-  }
-  // Posting an unblocked task should post the earlier deferred ones,
-  // in the right order.
-  task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(3); });
-
-  wait_for_tasks.Run();
-}
-
-TEST_F(PerfettoTaskRunnerTest, SequentialDeferredTasksByTimer) {
-  base::RunLoop wait_for_tasks;
-  SetTaskExpectations(wait_for_tasks.QuitClosure(), 3);
-
-  ScopedPerfettoPostTaskBlocker block(true);
-  auto weak_ptr = destination()->GetWeakPtr();
-  task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(1); });
-  task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(2); });
-  task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(3); });
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(0u, destination()->tasks_run());
-
-  // Start the timer which eventually will tick and post the previously
-  // deferred tasks. Note that this is posted directly to the taskqueue
-  // rather than the Perfetto wrapper, so it won't be deferred.
-  task_runner()->GetOrCreateTaskRunner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PerfettoTaskRunner::StartDeferredTasksDrainTimer,
-                     base::Unretained(task_runner())));
-
-  wait_for_tasks.Run();
-}
-
-TEST_F(PerfettoTaskRunnerTest, SequentialByMultipleSequences) {
-  base::RunLoop wait_for_tasks;
-  SetTaskExpectations(wait_for_tasks.QuitClosure(), 2001, 3);
-
-  auto weak_ptr = destination()->GetWeakPtr();
-
-  PosterThread first_thread(task_runner(), weak_ptr, 1000, 1);
-  PosterThread second_thread(task_runner(), weak_ptr, 1000, 2);
-  first_thread.Start();
-  second_thread.Start();
-  first_thread.Join();
-  second_thread.Join();
-
-  // Both threads set the taskrunner to defer new tasks, so none
-  // should have run at this point.
-  EXPECT_EQ(0u, destination()->tasks_run());
-
-  // Posting an unblocked task should post the earlier deferred ones,
-  // in the right order.
-  task_runner()->PostTask([weak_ptr]() { weak_ptr->TestTask(1, 0); });
-  wait_for_tasks.Run();
-}
-
 }  // namespace
 
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index aadb0b4..df1c396 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -267,7 +267,6 @@
       TraceConfig(data_source_config.chrome_config().trace_config());
   TraceLog::GetInstance()->SetEnabled(trace_config, TraceLog::RECORDING_MODE);
   ResetHistograms(trace_config);
-  PerfettoTracedProcess::GetTaskRunner()->StartDeferredTasksDrainTimer();
 }
 
 void TraceEventDataSource::StopTracing(
@@ -282,12 +281,6 @@
           return;
         }
 
-        // It's extremely unlikely any threads are still in mid-trace-event
-        // at this point and end up posting new tasks to the PerfettoTaskRunner
-        // which end up not getting run until the next tracing session; worst
-        // case is we lose some chunk commit messages and Perfetto will
-        // scrape the chunks.
-        PerfettoTracedProcess::GetTaskRunner()->StopDeferredTasksDrainTimer();
         data_source->UnregisterFromTraceLog();
 
         if (data_source->stop_complete_callback_) {
@@ -448,20 +441,13 @@
     // events emitted while the taskqueue is locked), we can't reset the
     // sink as the TraceWriter deletion is done through PostTask.
     if (new_session_id > kFirstSessionID &&
-        new_session_id != thread_local_event_sink->session_id() &&
-        !(trace_event->flags() & TRACE_EVENT_FLAG_DISALLOW_POSTTASK)) {
+        new_session_id != thread_local_event_sink->session_id()) {
       delete thread_local_event_sink;
       thread_local_event_sink = nullptr;
     }
   }
 
   if (!thread_local_event_sink) {
-    // Trace events emitted by the task queue itself can happen while the task
-    // queue is locked, posting to it reentrantly would deadlock so these events
-    // need to be flagged so we can avoid PostTasks while they're being emitted.
-    ScopedPerfettoPostTaskBlocker post_task_blocker(
-        !!(trace_event->flags() & TRACE_EVENT_FLAG_DISALLOW_POSTTASK));
-
     thread_local_event_sink =
         GetInstance()->CreateThreadLocalEventSink(thread_will_flush);
     ThreadLocalEventSinkSlot()->Set(thread_local_event_sink);
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
index 9059709..dd0a5971 100644
--- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
+++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.cc
@@ -176,9 +176,6 @@
   bool copy_strings = flags & TRACE_EVENT_FLAG_COPY;
   bool explicit_timestamp = flags & TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP;
 
-  ScopedPerfettoPostTaskBlocker post_task_blocker(
-      !!(flags & TRACE_EVENT_FLAG_DISALLOW_POSTTASK));
-
   if (reset_incremental_state_) {
     interned_event_categories_.ResetEmittedState();
     interned_event_names_.ResetEmittedState();
diff --git a/services/tracing/public/cpp/tracing_features.cc b/services/tracing/public/cpp/tracing_features.cc
index ee6a3979..7b446da 100644
--- a/services/tracing/public/cpp/tracing_features.cc
+++ b/services/tracing/public/cpp/tracing_features.cc
@@ -22,7 +22,7 @@
 // Runs the tracing service as an in-process browser service.
 const base::Feature kTracingServiceInProcess {
   "TracingServiceInProcess",
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(IS_CHROMECAST)
       base::FEATURE_ENABLED_BY_DEFAULT
 #else
       base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index 7414f2c..0aefd4f 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -17,20 +17,44 @@
     "gtest_tests": [
       {
         "args": [
-          "--gtest_filter=WebRtc*"
+          "--gtest_filter=WebRtc*",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
         ],
         "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "swarming": {
           "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
           "dimension_sets": [
             {
               "device_os": "K",
               "device_type": "hammerhead",
               "os": "Android"
             }
+          ],
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
           ]
         },
         "test": "content_browsertests"
@@ -41,20 +65,44 @@
     "gtest_tests": [
       {
         "args": [
-          "--gtest_filter=WebRtc*"
+          "--gtest_filter=WebRtc*",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
         ],
         "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "swarming": {
           "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
           "dimension_sets": [
             {
               "device_os": "MMB29Q",
               "device_type": "bullhead",
               "os": "Android"
             }
+          ],
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
           ]
         },
         "test": "content_browsertests"
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json
index acd79ed..a27c8db 100644
--- a/testing/buildbot/chromium.webrtc.json
+++ b/testing/buildbot/chromium.webrtc.json
@@ -6,14 +6,38 @@
     "gtest_tests": [
       {
         "args": [
-          "--gtest_filter=WebRtc*"
+          "--gtest_filter=WebRtc*",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
         ],
         "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "swarming": {
-          "can_use_on_swarming_builders": true
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ]
         },
         "test": "content_browsertests"
       },
@@ -21,15 +45,39 @@
         "args": [
           "--gtest_filter=UsingRealWebcam*",
           "--run-manual",
-          "--test-launcher-jobs=1"
+          "--test-launcher-jobs=1",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices"
         ],
         "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "content_browsertests_sequential"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
         "name": "content_browsertests_sequential",
         "swarming": {
-          "can_use_on_swarming_builders": true
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
+            }
+          ],
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ]
         },
         "test": "content_browsertests"
       }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 30ebeb6..102cf638 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -3944,6 +3944,7 @@
     'machines': {
       'WebRTC Chromium Android Builder': {},
       'WebRTC Chromium Android Tester': {
+        'os_type': 'android',
         'test_suites': {
           'gtest_tests': 'webrtc_android_tests_with_baremetal_tests',
         },
@@ -4017,6 +4018,7 @@
       'WebRTC Chromium FYI Android Builder (dbg)': {},
       'WebRTC Chromium FYI Android Builder ARM64 (dbg)': {},
       'WebRTC Chromium FYI Android Tests (dbg) (K Nexus5)': {
+        'os_type': 'android',
         'mixins': [
           'kitkat',
           'hammerhead',
@@ -4026,6 +4028,7 @@
         },
       },
       'WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)': {
+        'os_type': 'android',
         'mixins': [
           'marshmallow',
           'bullhead',
diff --git a/testing/merge_scripts/code_coverage/merge_results.py b/testing/merge_scripts/code_coverage/merge_results.py
index 59db3ff..aedfb267 100755
--- a/testing/merge_scripts/code_coverage/merge_results.py
+++ b/testing/merge_scripts/code_coverage/merge_results.py
@@ -51,43 +51,11 @@
   parser = _MergeAPIArgumentParser(description=desc)
   params = parser.parse_args()
 
-  logging.info('Merging %d test results', len(params.jsons_to_merge))
-
-  failed = False
-
-  # If given, always run the additional merge script, even if we only have one
-  # output json. Merge scripts sometimes upload artifacts to cloud storage, or
-  # do other processing which can be needed even if there's only one output.
-  if params.additional_merge_script:
-    new_args = [
-        '--build-properties', params.build_properties,
-        '--summary-json', params.summary_json,
-        '--task-output-dir', params.task_output_dir,
-        '--output-json', params.output_json,
-    ]
-    if params.additional_merge_script_args:
-      new_args += json.loads(params.additional_merge_script_args)
-
-    new_args += params.jsons_to_merge
-
-    args = [
-        sys.executable, params.additional_merge_script] + new_args
-    rc = subprocess.call(args)
-    if rc != 0:
-      failed = True
-      logging.warning('Additional merge script %s exited with %s' % (
-          params.additional_merge_script, rc
-      ))
-  elif len(params.jsons_to_merge) == 1:
-    logging.info("Only one output needs to be merged; directly copying it.")
-    with open(params.jsons_to_merge[0]) as f_read:
-      with open(params.output_json, 'w') as f_write:
-        f_write.write(f_read.read())
-  else:
-      logging.warning(
-          "This script was told to merge %d test results, but no additional "
-          "merge script was given.")
-
+  # NOTE: The coverage data merge script must make sure that the profraw files
+  # are deleted from the task output directory after merging, otherwise, other
+  # test results merge script such as layout tests will treat them as json test
+  # results files and result in errors.
+  logging.info('Merging code coverage profraw data')
   invalid_profiles = coverage_merger.merge_profiles(
       params.task_output_dir,
       os.path.join(params.profdata_dir, 'default.profdata'), '.profraw',
@@ -97,6 +65,44 @@
               'w') as f:
       json.dump(invalid_profiles, f)
 
+  logging.info('Merging %d test results', len(params.jsons_to_merge))
+  failed = False
+
+  # If given, always run the additional merge script, even if we only have one
+  # output json. Merge scripts sometimes upload artifacts to cloud storage, or
+  # do other processing which can be needed even if there's only one output.
+  if params.additional_merge_script:
+    new_args = [
+        '--build-properties',
+        params.build_properties,
+        '--summary-json',
+        params.summary_json,
+        '--task-output-dir',
+        params.task_output_dir,
+        '--output-json',
+        params.output_json,
+    ]
+    if params.additional_merge_script_args:
+      new_args += json.loads(params.additional_merge_script_args)
+
+    new_args += params.jsons_to_merge
+
+    args = [sys.executable, params.additional_merge_script] + new_args
+    rc = subprocess.call(args)
+    if rc != 0:
+      failed = True
+      logging.warning('Additional merge script %s exited with %s' %
+                      (params.additional_merge_script, rc))
+  elif len(params.jsons_to_merge) == 1:
+    logging.info("Only one output needs to be merged; directly copying it.")
+    with open(params.jsons_to_merge[0]) as f_read:
+      with open(params.output_json, 'w') as f_write:
+        f_write.write(f_read.read())
+  else:
+    logging.warning(
+        "This script was told to merge %d test results, but no additional "
+        "merge script was given.")
+
   return 1 if (failed or bool(invalid_profiles)) else 0
 
 
diff --git a/third_party/blink/common/push_messaging/OWNERS b/third_party/blink/common/push_messaging/OWNERS
new file mode 100644
index 0000000..b4200c27
--- /dev/null
+++ b/third_party/blink/common/push_messaging/OWNERS
@@ -0,0 +1,7 @@
+file://third_party/blink/renderer/modules/push_messaging/OWNERS
+
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
+
+# TEAM: platform-capabilities@chromium.org
+# COMPONENT: Blink>PushAPI
diff --git a/third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.cc b/third_party/blink/common/push_messaging/push_messaging_mojom_traits.cc
similarity index 100%
rename from third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.cc
rename to third_party/blink/common/push_messaging/push_messaging_mojom_traits.cc
diff --git a/third_party/blink/public/common/push_messaging/push_messaging.typemap b/third_party/blink/public/common/push_messaging/push_messaging.typemap
index 7a01b25..9f8410c 100644
--- a/third_party/blink/public/common/push_messaging/push_messaging.typemap
+++ b/third_party/blink/public/common/push_messaging/push_messaging.typemap
@@ -9,7 +9,7 @@
 ]
 traits_headers = [ "//third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.h" ]
 sources = [
-  "//third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.cc",
+  "//third_party/blink/common/push_messaging/push_messaging_mojom_traits.cc",
 ]
 type_mappings = [
   "blink.mojom.PushErrorType=blink::WebPushError::ErrorType",
diff --git a/third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.h b/third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.h
index d265541..2b316d47 100644
--- a/third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.h
+++ b/third_party/blink/public/common/push_messaging/push_messaging_mojom_traits.h
@@ -8,14 +8,16 @@
 #include <stddef.h>
 
 #include "mojo/public/cpp/bindings/struct_traits.h"
+#include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom.h"
 #include "third_party/blink/public/mojom/push_messaging/push_messaging_status.mojom.h"
 
 namespace mojo {
 
 template <>
-struct StructTraits<blink::mojom::PushSubscriptionOptionsDataView,
-                    blink::PushSubscriptionOptionsParams> {
+struct BLINK_COMMON_EXPORT
+    StructTraits<blink::mojom::PushSubscriptionOptionsDataView,
+                 blink::PushSubscriptionOptionsParams> {
   static bool user_visible_only(const blink::PushSubscriptionOptionsParams& r) {
     return r.user_visible_only;
   }
@@ -28,7 +30,8 @@
 };
 
 template <>
-struct EnumTraits<blink::mojom::PushErrorType, blink::WebPushError::ErrorType> {
+struct BLINK_COMMON_EXPORT
+    EnumTraits<blink::mojom::PushErrorType, blink::WebPushError::ErrorType> {
   static blink::mojom::PushErrorType ToMojom(
       blink::WebPushError::ErrorType input);
   static bool FromMojom(blink::mojom::PushErrorType input,
diff --git a/third_party/blink/public/mojom/reporting/reporting.mojom b/third_party/blink/public/mojom/reporting/reporting.mojom
index 605f4b3..1390f90 100644
--- a/third_party/blink/public/mojom/reporting/reporting.mojom
+++ b/third_party/blink/public/mojom/reporting/reporting.mojom
@@ -34,18 +34,17 @@
   // (See //third_party/blink/renderer/core/events/security_policy_violation_event.h.)
   QueueCspViolationReport(url.mojom.Url url,
                           string group,
-                          string document_uri,
-                          string referrer,
-                          string violated_directive,
+                          string document_url,
+                          string? referrer,
+                          string? blocked_url,
                           string effective_directive,
                           string original_policy,
-                          string disposition,
-                          string blocked_uri,
-                          int32 line_number,
-                          int32 column_number,
                           string? source_file,
+                          string? script_sample,
+                          string disposition,
                           uint16 status_code,
-                          string script_sample);
+                          int32 line_number,
+                          int32 column_number);
 
   // Attempts to queue a Feature Policy violation report using the Reporting API.
   //
diff --git a/third_party/blink/renderer/core/editing/BUILD.gn b/third_party/blink/renderer/core/editing/BUILD.gn
index c7ab9a5a..9517a04 100644
--- a/third_party/blink/renderer/core/editing/BUILD.gn
+++ b/third_party/blink/renderer/core/editing/BUILD.gn
@@ -246,8 +246,6 @@
     "selection_editor.h",
     "selection_modifier.cc",
     "selection_modifier.h",
-    "selection_modifier_character.cc",
-    "selection_modifier_word.cc",
     "selection_strategy.h",
     "selection_template.cc",
     "selection_template.h",
@@ -393,9 +391,7 @@
     "relocatable_position_test.cc",
     "selection_adjuster_test.cc",
     "selection_controller_test.cc",
-    "selection_modifier_character_test.cc",
     "selection_modifier_test.cc",
-    "selection_modifier_word_test.cc",
     "selection_template_test.cc",
     "serializers/styled_markup_serializer_test.cc",
     "set_selection_options_test.cc",
diff --git a/third_party/blink/renderer/core/editing/inline_box_traversal.cc b/third_party/blink/renderer/core/editing/inline_box_traversal.cc
index 955e7d94..e121ea2a 100644
--- a/third_party/blink/renderer/core/editing/inline_box_traversal.cc
+++ b/third_party/blink/renderer/core/editing/inline_box_traversal.cc
@@ -131,24 +131,9 @@
 
   TextDirection ParagraphDirection() const {
     DCHECK(IsNotNull());
-    if (IsOldLayout()) {
-      const ComputedStyle& block_style = *GetInlineBox().Root().Block().Style();
-      if (block_style.GetUnicodeBidi() != UnicodeBidi::kPlaintext)
-        return block_style.Direction();
-
-      // There is no reliable way to get the paragraph direction in legacy
-      // layout when 'unicode-bidi: plaintext' is set. Use the lowest-level
-      // inline box's direction as a workaround.
-      UBiDiLevel min_level = 128;
-      for (const InlineBox* runner = GetInlineBox().Root().FirstLeafChild();
-           runner; runner = runner->NextLeafChild()) {
-        min_level = std::min(min_level, runner->BidiLevel());
-      }
-      return DirectionFromLevel(min_level);
-    }
-    const auto& line_box = To<NGPhysicalLineBoxFragment>(
-        GetNGPaintFragment().ContainerLineBox()->PhysicalFragment());
-    return line_box.BaseDirection();
+    if (IsOldLayout())
+      return ParagraphDirectionOf(GetInlineBox());
+    return ParagraphDirectionOf(GetNGPaintFragment());
   }
 
  private:
@@ -811,44 +796,6 @@
 
 }  // namespace
 
-const InlineBox* InlineBoxTraversal::FindLeftBidiRun(const InlineBox& box,
-                                                     unsigned bidi_level) {
-  const AbstractInlineBox& result =
-      FindBidiRun<TraverseLeft>(AbstractInlineBox(box), bidi_level);
-  if (result.IsNull())
-    return nullptr;
-  DCHECK(result.IsOldLayout());
-  return &result.GetInlineBox();
-}
-
-const InlineBox* InlineBoxTraversal::FindRightBidiRun(const InlineBox& box,
-                                                      unsigned bidi_level) {
-  const AbstractInlineBox& result =
-      FindBidiRun<TraverseRight>(AbstractInlineBox(box), bidi_level);
-  if (result.IsNull())
-    return nullptr;
-  DCHECK(result.IsOldLayout());
-  return &result.GetInlineBox();
-}
-
-const InlineBox& InlineBoxTraversal::FindLeftBoundaryOfEntireBidiRun(
-    const InlineBox& box,
-    unsigned bidi_level) {
-  const AbstractInlineBox& result = FindBoundaryOfEntireBidiRun<TraverseLeft>(
-      AbstractInlineBox(box), bidi_level);
-  DCHECK(result.IsOldLayout());
-  return result.GetInlineBox();
-}
-
-const InlineBox& InlineBoxTraversal::FindRightBoundaryOfEntireBidiRun(
-    const InlineBox& box,
-    unsigned bidi_level) {
-  const AbstractInlineBox& result = FindBoundaryOfEntireBidiRun<TraverseRight>(
-      AbstractInlineBox(box), bidi_level);
-  DCHECK(result.IsOldLayout());
-  return result.GetInlineBox();
-}
-
 InlineBoxPosition BidiAdjustment::AdjustForCaretPositionResolution(
     const InlineBoxPosition& caret_position) {
   const AbstractInlineBoxAndSideAffinity unadjusted(caret_position);
@@ -901,4 +848,28 @@
   return RangeSelectionAdjuster::AdjustFor(base, extent);
 }
 
+// TODO(xiaochengh): Move this function to a better place
+TextDirection ParagraphDirectionOf(const InlineBox& box) {
+  const ComputedStyle& block_style = *box.Root().Block().Style();
+  if (block_style.GetUnicodeBidi() != UnicodeBidi::kPlaintext)
+    return block_style.Direction();
+
+  // There is no reliable way to get the paragraph direction in legacy
+  // layout when 'unicode-bidi: plaintext' is set. Use the lowest-level
+  // inline box's direction as a workaround.
+  UBiDiLevel min_level = 128;
+  for (const InlineBox* runner = box.Root().FirstLeafChild(); runner;
+       runner = runner->NextLeafChild()) {
+    min_level = std::min(min_level, runner->BidiLevel());
+  }
+  return DirectionFromLevel(min_level);
+}
+
+// TODO(xiaochengh): Move this function to a better place
+TextDirection ParagraphDirectionOf(const NGPaintFragment& fragment) {
+  const auto& line_box = To<NGPhysicalLineBoxFragment>(
+      fragment.ContainerLineBox()->PhysicalFragment());
+  return line_box.BaseDirection();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/inline_box_traversal.h b/third_party/blink/renderer/core/editing/inline_box_traversal.h
index 3e433017..5bccc36e 100644
--- a/third_party/blink/renderer/core/editing/inline_box_traversal.h
+++ b/third_party/blink/renderer/core/editing/inline_box_traversal.h
@@ -15,6 +15,8 @@
 class InlineBox;
 struct InlineBoxPosition;
 struct NGCaretPosition;
+class NGPaintFragment;
+enum class TextDirection : uint8_t;
 
 class BidiAdjustment final {
   STATIC_ONLY(BidiAdjustment);
@@ -41,31 +43,8 @@
       const PositionInFlatTreeWithAffinity&);
 };
 
-// This class provides common traveral functions on list of |InlineBox|.
-// TODO(xiaochengh): Code using InlineBoxTraversal should be merged into the .cc
-// file and templatized to share code with NG bidi traversal.
-class InlineBoxTraversal final {
-  STATIC_ONLY(InlineBoxTraversal);
-
- public:
-  // TODO(yosin): We should take |bidi_level| from |InlineBox::BidiLevel()|,
-  // once all call sites satisfy it.
-
-  // Traverses left/right from |box|, and returns the first box with bidi level
-  // less than or equal to |bidi_level| (excluding |box| itself). Returns
-  // |nullptr| when such a box doesn't exist.
-  static const InlineBox* FindLeftBidiRun(const InlineBox& box,
-                                          unsigned bidi_level);
-  static const InlineBox* FindRightBidiRun(const InlineBox& box,
-                                           unsigned bidi_level);
-
-  // Traverses left/right from |box|, and returns the last box with bidi level
-  // greater than or equal to |bidi_level| (including |box| itself).
-  static const InlineBox& FindLeftBoundaryOfEntireBidiRun(const InlineBox& box,
-                                                          unsigned bidi_level);
-  static const InlineBox& FindRightBoundaryOfEntireBidiRun(const InlineBox& box,
-                                                           unsigned bidi_level);
-};
+TextDirection ParagraphDirectionOf(const InlineBox&);
+TextDirection ParagraphDirectionOf(const NGPaintFragment&);
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/editing/selection_modifier.cc b/third_party/blink/renderer/core/editing/selection_modifier.cc
index 900d2b7..029a2fb 100644
--- a/third_party/blink/renderer/core/editing/selection_modifier.cc
+++ b/third_party/blink/renderer/core/editing/selection_modifier.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/core/editing/editor.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/inline_box_position.h"
+#include "third_party/blink/renderer/core/editing/inline_box_traversal.h"
 #include "third_party/blink/renderer/core/editing/local_caret_rect.h"
 #include "third_party/blink/renderer/core/editing/selection_template.h"
 #include "third_party/blink/renderer/core/editing/visible_position.h"
@@ -168,6 +169,30 @@
   return base::nullopt;
 }
 
+// TODO(xiaochengh): Deduplicate code with |DirectionAt()|.
+base::Optional<TextDirection> LineDirectionAt(const VisiblePosition& position) {
+  if (position.IsNull())
+    return base::nullopt;
+  const PositionWithAffinity adjusted = ComputeInlineAdjustedPosition(position);
+  if (adjusted.IsNull())
+    return base::nullopt;
+
+  if (NGInlineFormattingContextOf(adjusted.GetPosition())) {
+    if (const NGPaintFragment* fragment =
+            ComputeNGCaretPosition(adjusted).fragment) {
+      return ParagraphDirectionOf(*fragment);
+    }
+    return base::nullopt;
+  }
+
+  if (const InlineBox* box =
+          ComputeInlineBoxPositionForInlineAdjustedPosition(adjusted)
+              .inline_box) {
+    return ParagraphDirectionOf(*box);
+  }
+  return base::nullopt;
+}
+
 TextDirection DirectionOf(const VisibleSelection& visible_selection) {
   base::Optional<TextDirection> maybe_start_direction =
       DirectionAt(visible_selection.VisibleStart());
@@ -186,6 +211,11 @@
   return DirectionOf(selection_);
 }
 
+TextDirection SelectionModifier::LineDirectionOfExtent() const {
+  return LineDirectionAt(selection_.VisibleExtent())
+      .value_or(DirectionOfEnclosingBlockOf(selection_.Extent()));
+}
+
 static bool IsBaseStart(const VisibleSelection& visible_selection,
                         SelectionModifyDirection direction) {
   switch (direction) {
@@ -386,17 +416,17 @@
   switch (granularity) {
     case TextGranularity::kCharacter:
       if (!selection_.IsRange()) {
-        return RightPositionOf(ComputeVisibleExtent(selection_));
+        if (LineDirectionOfExtent() == TextDirection::kLtr)
+          return ModifyMovingForward(granularity);
+        return ModifyMovingBackward(granularity);
       }
       if (DirectionOfSelection() == TextDirection::kLtr)
         return CreateVisiblePosition(selection_.End(), selection_.Affinity());
       return CreateVisiblePosition(selection_.Start(), selection_.Affinity());
-    case TextGranularity::kWord: {
-      const bool skips_space_when_moving_right =
-          GetFrame().GetEditor().Behavior().ShouldSkipSpaceWhenMovingRight();
-      return RightWordPosition(ComputeVisibleExtent(selection_),
-                               skips_space_when_moving_right);
-    }
+    case TextGranularity::kWord:
+      if (LineDirectionOfExtent() == TextDirection::kLtr)
+        return ModifyMovingForward(granularity);
+      return ModifyMovingBackward(granularity);
     case TextGranularity::kSentence:
     case TextGranularity::kLine:
     case TextGranularity::kParagraph:
@@ -560,17 +590,17 @@
   switch (granularity) {
     case TextGranularity::kCharacter:
       if (!selection_.IsRange()) {
-        return LeftPositionOf(ComputeVisibleExtent(selection_));
+        if (LineDirectionOfExtent() == TextDirection::kLtr)
+          return ModifyMovingBackward(granularity);
+        return ModifyMovingForward(granularity);
       }
       if (DirectionOfSelection() == TextDirection::kLtr)
         return CreateVisiblePosition(selection_.Start(), selection_.Affinity());
       return CreateVisiblePosition(selection_.End(), selection_.Affinity());
-    case TextGranularity::kWord: {
-      const bool skips_space_when_moving_right =
-          GetFrame().GetEditor().Behavior().ShouldSkipSpaceWhenMovingRight();
-      return LeftWordPosition(ComputeVisibleExtent(selection_),
-                              skips_space_when_moving_right);
-    }
+    case TextGranularity::kWord:
+      if (LineDirectionOfExtent() == TextDirection::kLtr)
+        return ModifyMovingBackward(granularity);
+      return ModifyMovingForward(granularity);
     case TextGranularity::kSentence:
     case TextGranularity::kLine:
     case TextGranularity::kParagraph:
diff --git a/third_party/blink/renderer/core/editing/selection_modifier.h b/third_party/blink/renderer/core/editing/selection_modifier.h
index 30e3d75..7633511 100644
--- a/third_party/blink/renderer/core/editing/selection_modifier.h
+++ b/third_party/blink/renderer/core/editing/selection_modifier.h
@@ -79,6 +79,7 @@
                                             SelectionModifyDirection) const;
   TextDirection DirectionOfEnclosingBlock() const;
   TextDirection DirectionOfSelection() const;
+  TextDirection LineDirectionOfExtent() const;
   VisiblePosition PositionForPlatform(bool is_get_start) const;
   VisiblePosition StartForPlatform() const;
   VisiblePosition EndForPlatform() const;
@@ -100,13 +101,6 @@
   VisiblePosition ModifyMovingBackward(TextGranularity);
   Position NextWordPositionForPlatform(const Position&);
 
-  // TODO(editing-dev): We should handle |skips_spaces_when_moving_right| in
-  // another way, e.g. pass |EditingBehavior()|.
-  static VisiblePosition LeftWordPosition(const VisiblePosition&,
-                                          bool skips_space_when_moving_right);
-  static VisiblePosition RightWordPosition(const VisiblePosition&,
-                                           bool skips_space_when_moving_right);
-
   Member<const LocalFrame> frame_;
   // TODO(editing-dev): We should get rid of |selection_| once we change
   // all member functions not to use |selection_|.
@@ -124,22 +118,6 @@
 
 LayoutUnit NoXPosForVerticalArrowNavigation();
 
-// Following functions are exported for using in SelectionModifier and
-// testing only.
-
-// TODO(yosin) Since return value of |leftPositionOf()| with |VisiblePosition|
-// isn't defined well on flat tree, we should not use it for a position in
-// flat tree.
-CORE_EXPORT VisiblePosition LeftPositionOf(const VisiblePosition&);
-CORE_EXPORT VisiblePositionInFlatTree
-LeftPositionOf(const VisiblePositionInFlatTree&);
-// TODO(yosin) Since return value of |rightPositionOf()| with |VisiblePosition|
-// isn't defined well on flat tree, we should not use it for a position in
-// flat tree.
-CORE_EXPORT VisiblePosition RightPositionOf(const VisiblePosition&);
-CORE_EXPORT VisiblePositionInFlatTree
-RightPositionOf(const VisiblePositionInFlatTree&);
-
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_MODIFIER_H_
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_character.cc b/third_party/blink/renderer/core/editing/selection_modifier_character.cc
deleted file mode 100644
index 694593dd..0000000
--- a/third_party/blink/renderer/core/editing/selection_modifier_character.cc
+++ /dev/null
@@ -1,844 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/editing/selection_modifier.h"
-
-#include "third_party/blink/renderer/core/editing/editing_utilities.h"
-#include "third_party/blink/renderer/core/editing/inline_box_position.h"
-#include "third_party/blink/renderer/core/editing/inline_box_traversal.h"
-#include "third_party/blink/renderer/core/editing/ng_flat_tree_shorthands.h"
-#include "third_party/blink/renderer/core/editing/visible_position.h"
-#include "third_party/blink/renderer/core/editing/visible_units.h"
-#include "third_party/blink/renderer/core/layout/api/line_layout_api_shim.h"
-#include "third_party/blink/renderer/core/layout/api/line_layout_item.h"
-#include "third_party/blink/renderer/core/layout/layout_block_flow.h"
-#include "third_party/blink/renderer/core/layout/layout_text_fragment.h"
-#include "third_party/blink/renderer/core/layout/line/inline_text_box.h"
-#include "third_party/blink/renderer/core/layout/line/root_inline_box.h"
-#include "third_party/blink/renderer/core/layout/ng/inline/ng_caret_navigator.h"
-#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h"
-#include "third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h"
-
-namespace blink {
-
-namespace {
-
-// The traversal strategy for |LeftPositionOf()|.
-template <typename Strategy>
-struct TraversalLeft {
-  STATIC_ONLY(TraversalLeft);
-
-  static int CaretBackwardOffsetOf(const InlineBox& box) {
-    return box.CaretRightmostOffset();
-  }
-
-  static int CaretForwardOffsetOf(const InlineBox& box) {
-    return box.CaretLeftmostOffset();
-  }
-
-  static const InlineBox* ForwardLeafChildOf(const InlineBox& box) {
-    return box.PrevLeafChild();
-  }
-
-  static const InlineBox* ForwardLeafChildIgnoringLineBreakOf(
-      const InlineBox& box) {
-    return box.PrevLeafChildIgnoringLineBreak();
-  }
-
-  static int ForwardGraphemeBoundaryOf(TextDirection direction,
-                                       const Node& node,
-                                       int offset) {
-    if (direction == TextDirection::kLtr)
-      return PreviousGraphemeBoundaryOf(node, offset);
-    return NextGraphemeBoundaryOf(node, offset);
-  }
-
-  static bool IsOvershot(int offset, const InlineBox& box) {
-    if (box.IsLeftToRightDirection())
-      return offset < box.CaretMinOffset();
-    return offset > box.CaretMaxOffset();
-  }
-
-  static PositionTemplate<Strategy> ForwardVisuallyDistinctCandidateOf(
-      TextDirection direction,
-      const PositionTemplate<Strategy>& position) {
-    if (direction == TextDirection::kLtr)
-      return PreviousVisuallyDistinctCandidate(position);
-    return NextVisuallyDistinctCandidate(position);
-  }
-
-  static VisiblePositionTemplate<Strategy> HonorEditingBoundary(
-      TextDirection direction,
-      const VisiblePositionTemplate<Strategy>& visible_position,
-      const PositionTemplate<Strategy>& anchor) {
-    if (direction == TextDirection::kLtr) {
-      return AdjustBackwardPositionToAvoidCrossingEditingBoundaries(
-          visible_position, anchor);
-    }
-    return AdjustForwardPositionToAvoidCrossingEditingBoundaries(
-        visible_position, anchor);
-  }
-
-  // TODO(xiaochengh): The functions below are used only by bidi adjustment.
-  // Merge them into inline_box_traversal.cc.
-
-  static int CaretForwardOffsetInLineDirection(TextDirection line_direction,
-                                               const InlineBox& box) {
-    if (line_direction == TextDirection::kLtr)
-      return box.CaretMinOffset();
-    return box.CaretMaxOffset();
-  }
-
-  static const InlineBox* FindBackwardBidiRun(const InlineBox& box,
-                                              unsigned bidi_level) {
-    return InlineBoxTraversal::FindRightBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox& FindBackwardBoundaryOfEntireBidiRun(
-      const InlineBox& box,
-      unsigned bidi_level) {
-    return InlineBoxTraversal::FindRightBoundaryOfEntireBidiRun(box,
-                                                                bidi_level);
-  }
-
-  static const InlineBox* FindForwardBidiRun(const InlineBox& box,
-                                             unsigned bidi_level) {
-    return InlineBoxTraversal::FindLeftBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox& FindForwardBoundaryOfEntireBidiRun(
-      const InlineBox& box,
-      unsigned bidi_level) {
-    return InlineBoxTraversal::FindLeftBoundaryOfEntireBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox* ForwardNonPseudoLeafChildOf(const InlineBox& box) {
-    for (const InlineBox* runner = ForwardLeafChildOf(box); runner;
-         runner = ForwardLeafChildOf(*runner)) {
-      if (runner->GetLineLayoutItem().GetNode())
-        return runner;
-    }
-    return nullptr;
-  }
-
-  static const InlineBox* LogicalForwardMostInLine(TextDirection line_direction,
-                                                   const InlineBox& box) {
-    if (line_direction == TextDirection::kLtr)
-      return box.Root().GetLogicalStartNonPseudoBox();
-    return box.Root().GetLogicalEndNonPseudoBox();
-  }
-
-  static NGCaretNavigator::VisualCaretMovementResult ForwardPositionOf(
-      const NGCaretNavigator& caret_navigator,
-      const NGCaretNavigator::Position& caret_position) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.LeftPositionOf(caret_position);
-  }
-
-  static NGCaretNavigator::Position MostBackwardPositionInFirstLine(
-      const NGCaretNavigator& caret_navigator) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.RightmostPositionInFirstLine();
-  }
-
-  static NGCaretNavigator::Position MostBackwardPositionInLastLine(
-      const NGCaretNavigator& caret_navigator) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.RightmostPositionInLastLine();
-  }
-};
-
-// The traversal strategy for |RightPositionOf()|.
-template <typename Strategy>
-struct TraversalRight {
-  STATIC_ONLY(TraversalRight);
-
-  static int CaretBackwardOffsetOf(const InlineBox& box) {
-    return box.CaretLeftmostOffset();
-  }
-
-  static int CaretForwardOffsetOf(const InlineBox& box) {
-    return box.CaretRightmostOffset();
-  }
-
-  static const InlineBox* ForwardLeafChildOf(const InlineBox& box) {
-    return box.NextLeafChild();
-  }
-
-  static const InlineBox* ForwardLeafChildIgnoringLineBreakOf(
-      const InlineBox& box) {
-    return box.NextLeafChildIgnoringLineBreak();
-  }
-
-  static int ForwardGraphemeBoundaryOf(TextDirection direction,
-                                       const Node& node,
-                                       int offset) {
-    if (direction == TextDirection::kLtr)
-      return NextGraphemeBoundaryOf(node, offset);
-    return PreviousGraphemeBoundaryOf(node, offset);
-  }
-
-  static bool IsOvershot(int offset, const InlineBox& box) {
-    if (box.IsLeftToRightDirection())
-      return offset > box.CaretMaxOffset();
-    return offset < box.CaretMinOffset();
-  }
-
-  static PositionTemplate<Strategy> ForwardVisuallyDistinctCandidateOf(
-      TextDirection direction,
-      const PositionTemplate<Strategy>& position) {
-    if (direction == TextDirection::kLtr)
-      return NextVisuallyDistinctCandidate(position);
-    return PreviousVisuallyDistinctCandidate(position);
-  }
-
-  static VisiblePositionTemplate<Strategy> HonorEditingBoundary(
-      TextDirection direction,
-      const VisiblePositionTemplate<Strategy>& visible_position,
-      const PositionTemplate<Strategy>& anchor) {
-    if (direction == TextDirection::kLtr) {
-      return AdjustForwardPositionToAvoidCrossingEditingBoundaries(
-          visible_position, anchor);
-    }
-    return AdjustBackwardPositionToAvoidCrossingEditingBoundaries(
-        visible_position, anchor);
-  }
-
-  // TODO(xiaochengh): The functions below are used only by bidi adjustment.
-  // Merge them into inline_box_traversal.cc.
-
-  static int CaretForwardOffsetInLineDirection(TextDirection line_direction,
-                                               const InlineBox& box) {
-    if (line_direction == TextDirection::kLtr)
-      return box.CaretMaxOffset();
-    return box.CaretMinOffset();
-  }
-
-  static const InlineBox* FindBackwardBidiRun(const InlineBox& box,
-                                              unsigned bidi_level) {
-    return InlineBoxTraversal::FindLeftBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox& FindBackwardBoundaryOfEntireBidiRun(
-      const InlineBox& box,
-      unsigned bidi_level) {
-    return InlineBoxTraversal::FindLeftBoundaryOfEntireBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox* FindForwardBidiRun(const InlineBox& box,
-                                             unsigned bidi_level) {
-    return InlineBoxTraversal::FindRightBidiRun(box, bidi_level);
-  }
-
-  static const InlineBox& FindForwardBoundaryOfEntireBidiRun(
-      const InlineBox& box,
-      unsigned bidi_level) {
-    return InlineBoxTraversal::FindRightBoundaryOfEntireBidiRun(box,
-                                                                bidi_level);
-  }
-
-  static const InlineBox* ForwardNonPseudoLeafChildOf(const InlineBox& box) {
-    for (const InlineBox* runner = ForwardLeafChildOf(box); runner;
-         runner = ForwardLeafChildOf(*runner)) {
-      if (runner->GetLineLayoutItem().GetNode())
-        return runner;
-    }
-    return nullptr;
-  }
-
-  static const InlineBox* LogicalForwardMostInLine(TextDirection line_direction,
-                                                   const InlineBox& box) {
-    if (line_direction == TextDirection::kLtr)
-      return box.Root().GetLogicalEndNonPseudoBox();
-    return box.Root().GetLogicalStartNonPseudoBox();
-  }
-
-  static NGCaretNavigator::VisualCaretMovementResult ForwardPositionOf(
-      const NGCaretNavigator& caret_navigator,
-      const NGCaretNavigator::Position& caret_position) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.RightPositionOf(caret_position);
-  }
-
-  static NGCaretNavigator::Position MostBackwardPositionInFirstLine(
-      const NGCaretNavigator& caret_navigator) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.LeftmostPositionInFirstLine();
-  }
-
-  static NGCaretNavigator::Position MostBackwardPositionInLastLine(
-      const NGCaretNavigator& caret_navigator) {
-    DCHECK(RuntimeEnabledFeatures::BidiCaretAffinityEnabled());
-    return caret_navigator.LeftmostPositionInLastLine();
-  }
-};
-
-template <typename Traversal>
-bool IsBeforeAtomicInlineOrLineBreak(const InlineBox& box, int offset) {
-  if (offset != Traversal::CaretBackwardOffsetOf(box))
-    return false;
-  if (box.IsInlineTextBox() && ToInlineTextBox(box).IsLineBreak())
-    return true;
-  return box.GetLineLayoutItem().IsAtomicInlineLevel();
-}
-
-// TODO(xiaochengh): The function is for bidi adjustment.
-// Merge it into inline_box_traversal.cc.
-template <typename Traversal>
-const InlineBox* LeadingBoxOfEntireSecondaryRun(const InlineBox* box) {
-  const InlineBox* runner = box;
-  while (true) {
-    const InlineBox& backward_box =
-        Traversal::FindBackwardBoundaryOfEntireBidiRun(*runner,
-                                                       runner->BidiLevel());
-    if (backward_box.BidiLevel() == runner->BidiLevel())
-      return &backward_box;
-    DCHECK_GT(backward_box.BidiLevel(), runner->BidiLevel());
-    runner = &backward_box;
-
-    const InlineBox& forward_box =
-        Traversal::FindForwardBoundaryOfEntireBidiRun(*runner,
-                                                      runner->BidiLevel());
-    if (forward_box.BidiLevel() == runner->BidiLevel())
-      return &forward_box;
-    DCHECK_GT(forward_box.BidiLevel(), runner->BidiLevel());
-    runner = &forward_box;
-  }
-}
-
-// TODO(xiaochengh): The function is for bidi adjustment.
-// Merge it into inline_box_traversal.cc.
-// TODO(xiaochengh): Stop passing return value by non-const reference parameters
-template <typename Traversal>
-bool FindForwardBoxInPossiblyBidiContext(const InlineBox*& box,
-                                         int& offset,
-                                         TextDirection line_direction) {
-  const unsigned char level = box->BidiLevel();
-  if (box->Direction() == line_direction) {
-    const InlineBox* const forward_box = Traversal::ForwardLeafChildOf(*box);
-    if (!forward_box) {
-      if (const InlineBox* logical_forward_most =
-              Traversal::LogicalForwardMostInLine(line_direction, *box)) {
-        box = logical_forward_most;
-        offset =
-            Traversal::CaretForwardOffsetInLineDirection(line_direction, *box);
-      }
-      return true;
-    }
-    if (forward_box->BidiLevel() >= level)
-      return true;
-
-    const unsigned char forward_level = forward_box->BidiLevel();
-    const InlineBox* const backward_box =
-        Traversal::FindBackwardBidiRun(*box, forward_level);
-    if (backward_box && backward_box->BidiLevel() == forward_level)
-      return true;
-
-    box = forward_box;
-    offset = Traversal::CaretBackwardOffsetOf(*box);
-    return box->Direction() == line_direction;
-  }
-
-  const InlineBox* const forward_non_pseudo_box =
-      Traversal::ForwardNonPseudoLeafChildOf(*box);
-  if (forward_non_pseudo_box) {
-    box = forward_non_pseudo_box;
-    offset = Traversal::CaretBackwardOffsetOf(*box);
-    if (box->BidiLevel() > level) {
-      const InlineBox* const forward_bidi_run =
-          Traversal::FindForwardBidiRun(*forward_non_pseudo_box, level);
-      if (!forward_bidi_run || forward_bidi_run->BidiLevel() < level)
-        return false;
-    }
-    return true;
-  }
-  // Trailing edge of a secondary run. Set to the leading edge of
-  // the entire run.
-  box = LeadingBoxOfEntireSecondaryRun<Traversal>(box);
-  offset = Traversal::CaretForwardOffsetInLineDirection(line_direction, *box);
-  return true;
-}
-
-template <typename Strategy, typename Traversal>
-static PositionTemplate<Strategy> TraverseInternalAlgorithm(
-    const VisiblePositionTemplate<Strategy>& visible_position) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  if (visible_position.IsNull())
-    return PositionTemplate<Strategy>();
-
-  const PositionTemplate<Strategy> deep_position =
-      visible_position.DeepEquivalent();
-  const PositionTemplate<Strategy> downstream_start =
-      MostForwardCaretPosition(deep_position);
-  const TextDirection line_direction =
-      PrimaryDirectionOf(*deep_position.AnchorNode());
-  const TextAffinity affinity = visible_position.Affinity();
-
-  // Conceptually, starting from the given caret position, traverse each leaf
-  // inline box and each caret position in the box (skipping CSS generated
-  // content) until we have:
-  // - crossed a grapheme boundary, or
-  // - reached the line boundary, or
-  // - reached an atomic inline.
-  // TODO(xiaochengh): Refactor the code to make it closer to the above.
-  // TODO(xiaochengh): Simplify loop termination conditions. Find and fix any
-  // possibility of infinite iterations.
-  for (InlineBoxPosition box_position =
-           ComputeInlineBoxPosition(visible_position.ToPositionWithAffinity());
-       ;) {
-    const InlineBox* const box = box_position.inline_box;
-    const int offset = box_position.offset_in_box;
-    if (!box) {
-      return Traversal::ForwardVisuallyDistinctCandidateOf(line_direction,
-                                                           deep_position);
-    }
-
-    const InlineBox* next_box = nullptr;
-    int next_offset = 0;
-    bool can_create_position = false;
-
-    // TODO(xiaochengh): The loop below iterates for exactly once. Merge it into
-    // the outer loop and clean up the code.
-    do {
-      if (IsBeforeAtomicInlineOrLineBreak<Traversal>(*box, offset)) {
-        return Traversal::ForwardVisuallyDistinctCandidateOf(box->Direction(),
-                                                             deep_position);
-      }
-
-      const LineLayoutItem line_layout_item = box->GetLineLayoutItem();
-
-      // Skip generated content.
-      if (!line_layout_item.GetNode()) {
-        next_box = Traversal::ForwardLeafChildOf(*box);
-        if (!next_box) {
-          return Traversal::ForwardVisuallyDistinctCandidateOf(line_direction,
-                                                               deep_position);
-        }
-        next_offset = Traversal::CaretBackwardOffsetOf(*next_box);
-        continue;
-      }
-
-      const int forward_grapheme_boundary =
-          Traversal::ForwardGraphemeBoundaryOf(
-              box->Direction(), *line_layout_item.GetNode(), offset);
-
-      const int caret_min_offset = box->CaretMinOffset();
-      const int caret_max_offset = box->CaretMaxOffset();
-
-      if (forward_grapheme_boundary > caret_min_offset &&
-          forward_grapheme_boundary < caret_max_offset) {
-        next_box = box;
-        next_offset = forward_grapheme_boundary;
-        can_create_position = true;
-        break;
-      }
-
-      if (Traversal::IsOvershot(forward_grapheme_boundary, *box)) {
-        // Overshot forwardly.
-        const InlineBox* const forward_box =
-            Traversal::ForwardLeafChildIgnoringLineBreakOf(*box);
-        if (!forward_box) {
-          const PositionTemplate<Strategy>& forward_position =
-              Traversal::ForwardVisuallyDistinctCandidateOf(
-                  line_direction, visible_position.DeepEquivalent());
-          if (forward_position.IsNull())
-            return PositionTemplate<Strategy>();
-
-          const InlineBox* forward_position_box =
-              ComputeInlineBoxPosition(PositionWithAffinityTemplate<Strategy>(
-                                           forward_position, affinity))
-                  .inline_box;
-          if (forward_position_box &&
-              forward_position_box->Root() == box->Root())
-            return PositionTemplate<Strategy>();
-          return forward_position;
-        }
-
-        // Reposition at the other logical position corresponding to our
-        // edge's visual position and go for another round.
-        next_box = forward_box;
-        next_offset = Traversal::CaretBackwardOffsetOf(*forward_box);
-        continue;
-      }
-
-      DCHECK_EQ(forward_grapheme_boundary,
-                Traversal::CaretForwardOffsetOf(*box));
-      next_box = box;
-      next_offset = forward_grapheme_boundary;
-      // We may be at a bidi boundary, in which case the visual caret position
-      // doesn't match its DOM position, and certain adjustment is needed.
-      can_create_position = FindForwardBoxInPossiblyBidiContext<Traversal>(
-          next_box, next_offset, line_direction);
-    } while (false);
-
-    if (!can_create_position) {
-      box_position = InlineBoxPosition(next_box, next_offset);
-      continue;
-    }
-
-    // TODO(xiaochengh): Eliminate single-char variable name.
-    const PositionTemplate<Strategy> p =
-        PositionTemplate<Strategy>::EditingPositionOf(
-            next_box->GetLineLayoutItem().GetNode(), next_offset);
-
-    if ((IsVisuallyEquivalentCandidate(p) &&
-         MostForwardCaretPosition(p) != downstream_start) ||
-        p.AtStartOfTree() || p.AtEndOfTree())
-      return p;
-
-    // TODO(xiaochengh): This detour to |p| seems unnecessary. Investigate if we
-    // can simply use |InlineBoxPosition(next_box, next_offset)|.
-    DCHECK_NE(p, deep_position);
-    box_position = ComputeInlineBoxPosition(
-        PositionWithAffinityTemplate<Strategy>(p, affinity));
-  }
-}
-
-// TODO(xiaochengh): This class will likely be reused elsewhere. Move it to its
-// own files.
-class InlineFormattingContextTraversal {
-  STATIC_ONLY(InlineFormattingContextTraversal);
-
- public:
-  static LayoutBlockFlow* PreviousContextOf(const LayoutBlockFlow& start) {
-    const LayoutObject* stay_within = AncestorToStayWithin(start);
-    for (LayoutObject* runner =
-             start.PreviousInPostOrderBeforeChildren(stay_within);
-         runner;) {
-      if (ShouldNotEnter(*runner)) {
-        runner = runner->PreviousInPostOrderBeforeChildren(stay_within);
-        continue;
-      }
-
-      if (IsValidContextForCaretNavigation(*runner))
-        return To<LayoutBlockFlow>(runner);
-
-      runner = runner->PreviousInPostOrder(stay_within);
-    }
-    return nullptr;
-  }
-
-  static LayoutBlockFlow* NextContextOf(const LayoutBlockFlow& start) {
-    const LayoutObject* stay_within = AncestorToStayWithin(start);
-    for (LayoutObject* runner = start.NextInPreOrderAfterChildren(stay_within);
-         runner;) {
-      if (ShouldNotEnter(*runner)) {
-        runner = runner->NextInPreOrderAfterChildren(stay_within);
-        continue;
-      }
-
-      if (IsValidContextForCaretNavigation(*runner))
-        return To<LayoutBlockFlow>(runner);
-
-      runner = runner->NextInPreOrder(stay_within);
-    }
-    return nullptr;
-  }
-
- private:
-  static bool IsValidContextForCaretNavigation(LayoutObject& object) {
-    auto* block_flow = DynamicTo<LayoutBlockFlow>(object);
-    if (!block_flow || !object.ChildrenInline())
-      return false;
-
-    if (block_flow->IsLayoutNGMixin()) {
-      if (!block_flow->HasNGInlineNodeData() ||
-          !block_flow->GetNGInlineNodeData()->text_content.length()) {
-        return false;
-      }
-    }
-
-    const NGOffsetMapping* mapping = NGInlineNode::GetOffsetMapping(block_flow);
-    DCHECK(mapping);
-
-    // Reject empty blocks
-    // TODO(xiaochengh): We may need to support empty block.
-    if (!mapping->GetText().length())
-      return false;
-
-    // Reject if the block has CSS-generated contents only
-    for (const NGOffsetMappingUnit& unit : mapping->GetUnits()) {
-      if (unit.GetType() != NGOffsetMappingUnitType::kCollapsed &&
-          unit.AssociatedNode())
-        return true;
-    }
-    return false;
-  }
-
-  // TODO(xiaochengh): Move it to another place as it seems general.
-  static bool IsUserAgentShadowHost(const LayoutObject& object) {
-    if (!object.NonPseudoNode() || !object.NonPseudoNode()->IsElementNode())
-      return false;
-    const Element& element = *ToElement(object.NonPseudoNode());
-    return element.GetShadowRoot() && element.GetShadowRoot()->IsUserAgent();
-  }
-
-  static bool ShouldNotEnter(const LayoutObject& object) {
-    // Heuristic rules of whether caret movement can enter an object.
-    // TODO(xiaochengh): The rules will likely be extended in the future.
-    return IsUserAgentShadowHost(object);
-  }
-
-  static bool ShouldNotExit(const LayoutObject& object) {
-    // Heuristic rules of whether caret movement can exit an object.
-    // TODO(xiaochengh): The rules will likely be extended in the future.
-    return IsUserAgentShadowHost(object);
-  }
-
-  static const LayoutObject* AncestorToStayWithin(
-      const LayoutBlockFlow& start) {
-    for (const LayoutObject* runner = start.Parent(); runner;
-         runner = runner->Parent()) {
-      if (ShouldNotExit(*runner))
-        return runner;
-    }
-    return nullptr;
-  }
-};
-
-template <typename Strategy, typename Traversal>
-PositionWithAffinityTemplate<Strategy> TraverseOutOfCurrentContext(
-    const LayoutBlockFlow& context,
-    NGCaretNavigator::VisualMovementResultType type) {
-  // TODO(xiaochengh): Handle the case where we move out from an inline block
-  // into its parent/ancestor inline formatting context.
-
-  const bool is_before_context =
-      type == NGCaretNavigator::VisualMovementResultType::kBeforeContext;
-  LayoutBlockFlow* target_context =
-      is_before_context
-          ? InlineFormattingContextTraversal::PreviousContextOf(context)
-          : InlineFormattingContextTraversal::NextContextOf(context);
-  if (!target_context)
-    return PositionWithAffinityTemplate<Strategy>();
-
-  if (!target_context->IsLayoutNGMixin()) {
-    // We have traversed to a legacy block.
-    // TODO(xiaochengh): In most cases, we reach here by crossing an editability
-    // boundary, for which we can simply return null. Investigate if there are
-    // other cases that require a non-trivial fallback.
-    return PositionWithAffinityTemplate<Strategy>();
-  }
-
-  NGCaretNavigator target_navigator(*target_context);
-  const NGCaretNavigator::Position result =
-      is_before_context
-          ? Traversal::MostBackwardPositionInLastLine(target_navigator)
-          : Traversal::MostBackwardPositionInFirstLine(target_navigator);
-
-  DCHECK(NGInlineNode::GetOffsetMapping(target_context));
-  return FromPositionInDOMTree<Strategy>(
-      NGInlineNode::GetOffsetMapping(target_context)
-          ->GetPositionWithAffinity(result));
-}
-
-template <typename Strategy, typename Traversal>
-PositionWithAffinityTemplate<Strategy> TraverseIntoChildContext(
-    const PositionTemplate<Strategy>& position) {
-  DCHECK(position.IsNotNull());
-  DCHECK(position.IsBeforeAnchor() || position.IsAfterAnchor()) << position;
-  DCHECK(position.AnchorNode()->GetLayoutObject()) << position;
-  DCHECK(position.AnchorNode()->GetLayoutObject()->IsLayoutBlockFlow())
-      << position;
-
-  auto* target_block =
-      To<LayoutBlockFlow>(position.AnchorNode()->GetLayoutObject());
-
-  if (!target_block->IsLayoutNGMixin()) {
-    // In most cases, we reach here by crossing editing boundary, in which case
-    // returning null position suffices.
-    // TODO(xiaochengh): Investigate if there are other cases that need a
-    // non-trivial legacy fallback.
-    return PositionWithAffinityTemplate<Strategy>();
-  }
-
-  if (!target_block->ChildrenInline() || !target_block->HasNGInlineNodeData() ||
-      !target_block->GetNGInlineNodeData()->text_content.length()) {
-    // TODO(xiaochengh): Implement when |target_block| has its own child blocks,
-    // or when |target_block| is empty.
-    return PositionWithAffinityTemplate<Strategy>();
-  }
-
-  NGCaretNavigator caret_navigator(*target_block);
-  DCHECK(caret_navigator.GetText().length());
-
-  const NGCaretNavigator::Position position_in_target =
-      position.IsBeforeAnchor()
-          ? Traversal::MostBackwardPositionInFirstLine(caret_navigator)
-          : Traversal::MostBackwardPositionInLastLine(caret_navigator);
-
-  // When moving into inline block, the caret moves over the first character
-  // seamlessly as if there's no inline block boundary. For example:
-  // RightPositionOf(foo|<inline-block>bar</inline-block>)
-  // -> foo<inline-block>b|ar</inline-block>
-  const NGCaretNavigator::VisualCaretMovementResult result_position =
-      Traversal::ForwardPositionOf(caret_navigator, position_in_target);
-
-  if (!result_position.IsWithinContext()) {
-    // TODO(xiaochengh): We reach here if |target_block| starts with an
-    // enterable child context. Fix it with proper block navigation.
-    // Also investigate if we reach here for other reasons.
-    return PositionWithAffinityTemplate<Strategy>();
-  }
-
-  const NGOffsetMapping* mapping = NGInlineNode::GetOffsetMapping(target_block);
-  return FromPositionInDOMTree<Strategy>(
-      mapping->GetPositionWithAffinity(*result_position.position));
-}
-
-template <typename Strategy, typename Traversal>
-PositionWithAffinityTemplate<Strategy> TraverseWithBidiCaretAffinity(
-    const PositionWithAffinityTemplate<Strategy>&
-        start_position_with_affinity) {
-  const PositionTemplate<Strategy> start_position =
-      start_position_with_affinity.GetPosition();
-  const Position start_position_in_dom = ToPositionInDOMTree(start_position);
-  if (start_position_in_dom.IsNull())
-    return PositionWithAffinityTemplate<Strategy>();
-
-  LayoutBlockFlow* const context =
-      NGOffsetMapping::GetInlineFormattingContextOf(start_position_in_dom);
-  if (!context) {
-    // We reach here if, e.g., the position is in an empty block.
-    // TODO(xiaochengh): Investigate if we reach here for other reaseons.
-#if DCHECK_IS_ON()
-    const Node* node = start_position.ComputeContainerNode();
-    DCHECK(node) << start_position;
-    const LayoutObject* object = node->GetLayoutObject();
-    DCHECK(object) << start_position;
-    DCHECK(object->IsLayoutBlockFlow()) << start_position;
-    DCHECK(!HasRenderedNonAnonymousDescendantsWithHeight(object))
-        << start_position;
-#endif
-    const TextDirection block_direction =
-        DirectionOfEnclosingBlockOf(start_position);
-    // TODO(xiaochengh): Should return the visual line start/end of the position
-    // below.
-    return PositionWithAffinityTemplate<Strategy>(
-        Traversal::ForwardVisuallyDistinctCandidateOf(block_direction,
-                                                      start_position));
-  }
-
-  DCHECK(context->IsLayoutNGMixin());
-  const NGOffsetMapping* mapping = NGInlineNode::GetOffsetMapping(context);
-  DCHECK(mapping);
-
-  const base::Optional<unsigned> start_offset =
-      mapping->GetTextContentOffset(start_position_in_dom);
-  DCHECK(start_offset.has_value());
-
-  NGCaretNavigator caret_navigator(*context);
-  const NGCaretNavigator::Position start_caret_position =
-      caret_navigator.CaretPositionFromTextContentOffsetAndAffinity(
-          start_offset.value(), start_position_with_affinity.Affinity());
-  NGCaretNavigator::VisualCaretMovementResult result_caret_position =
-      Traversal::ForwardPositionOf(caret_navigator, start_caret_position);
-  if (result_caret_position.IsWithinContext()) {
-    DCHECK(result_caret_position.position.has_value());
-    return FromPositionInDOMTree<Strategy>(mapping->GetPositionWithAffinity(
-        result_caret_position.position.value()));
-  }
-
-  if (result_caret_position.HasEnteredChildContext()) {
-    DCHECK(result_caret_position.position.has_value());
-    const PositionTemplate<Strategy> outside_child_context =
-        FromPositionInDOMTree<Strategy>(
-            mapping->GetPositionWithAffinity(*result_caret_position.position))
-            .GetPosition();
-
-    return TraverseIntoChildContext<Strategy, Traversal>(outside_child_context);
-  }
-
-  // We reach here if we need to move out of the current block.
-  DCHECK(result_caret_position.IsBeforeContext() ||
-         result_caret_position.IsAfterContext());
-  return TraverseOutOfCurrentContext<Strategy, Traversal>(
-      *context, result_caret_position.type);
-}
-
-template <typename Strategy, typename Traversal>
-VisiblePositionTemplate<Strategy> TraverseAlgorithm(
-    const VisiblePositionTemplate<Strategy>& visible_position) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-
-  VisiblePositionTemplate<Strategy> result;
-  if (!RuntimeEnabledFeatures::BidiCaretAffinityEnabled() ||
-      !NGInlineFormattingContextOf(visible_position.DeepEquivalent())) {
-    const PositionTemplate<Strategy> pos =
-        TraverseInternalAlgorithm<Strategy, Traversal>(visible_position);
-    // TODO(yosin) Why can't we move left from the last position in a tree?
-    if (pos.AtStartOfTree() || pos.AtEndOfTree())
-      return VisiblePositionTemplate<Strategy>();
-    result = CreateVisiblePosition(pos);
-    DCHECK_NE(result.DeepEquivalent(), visible_position.DeepEquivalent());
-  } else {
-    const PositionWithAffinityTemplate<Strategy> pos =
-        TraverseWithBidiCaretAffinity<Strategy, Traversal>(
-            visible_position.ToPositionWithAffinity());
-    if (pos.IsNull())
-      return VisiblePositionTemplate<Strategy>();
-    result = CreateVisiblePosition(pos);
-    DCHECK_NE(result.ToPositionWithAffinity(),
-              visible_position.ToPositionWithAffinity())
-        << visible_position;
-  }
-
-  return Traversal::HonorEditingBoundary(
-      DirectionOfEnclosingBlockOf(result.DeepEquivalent()), result,
-      visible_position.DeepEquivalent());
-}
-
-}  // namespace
-
-VisiblePosition LeftPositionOf(const VisiblePosition& visible_position) {
-  return TraverseAlgorithm<EditingStrategy, TraversalLeft<EditingStrategy>>(
-      visible_position);
-}
-
-VisiblePositionInFlatTree LeftPositionOf(
-    const VisiblePositionInFlatTree& visible_position) {
-  return TraverseAlgorithm<EditingInFlatTreeStrategy,
-                           TraversalLeft<EditingInFlatTreeStrategy>>(
-      visible_position);
-}
-
-VisiblePosition RightPositionOf(const VisiblePosition& visible_position) {
-  return TraverseAlgorithm<EditingStrategy, TraversalRight<EditingStrategy>>(
-      visible_position);
-}
-
-VisiblePositionInFlatTree RightPositionOf(
-    const VisiblePositionInFlatTree& visible_position) {
-  return TraverseAlgorithm<EditingInFlatTreeStrategy,
-                           TraversalRight<EditingInFlatTreeStrategy>>(
-      visible_position);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_character_test.cc b/third_party/blink/renderer/core/editing/selection_modifier_character_test.cc
deleted file mode 100644
index 935e31e..0000000
--- a/third_party/blink/renderer/core/editing/selection_modifier_character_test.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/editing/selection_modifier.h"
-
-#include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
-
-namespace blink {
-
-class SelectionModifierCharacterTest : public EditingTestBase {};
-
-// Regression test for crbug.com/834850
-TEST_F(SelectionModifierCharacterTest, MoveLeftTowardsListMarkerNoCrash) {
-  const SelectionInDOMTree selection =
-      SetSelectionTextToBody("<ol contenteditable><li>|<br></li></ol>");
-  SelectionModifier modifier(GetFrame(), selection);
-  modifier.Modify(SelectionModifyAlteration::kMove,
-                  SelectionModifyDirection::kLeft, TextGranularity::kCharacter);
-  // Shouldn't crash here.
-  EXPECT_EQ("<ol contenteditable><li>|<br></li></ol>",
-            GetSelectionTextFromBody(modifier.Selection().AsSelection()));
-}
-
-// Regression test for crbug.com/861559
-TEST_F(SelectionModifierCharacterTest, MoveRightInDirAutoBidiTextNoCrash) {
-  const SelectionInDOMTree selection = SetSelectionTextToBody(
-      u8"<pre contenteditable dir=\"auto\">\u05D0$|A$\u05D0</pre>");
-  SelectionModifier modifier(GetFrame(), selection);
-  modifier.Modify(SelectionModifyAlteration::kMove,
-                  SelectionModifyDirection::kRight,
-                  TextGranularity::kCharacter);
-  // Shouldn't crash here.
-  EXPECT_EQ(u8"<pre contenteditable dir=\"auto\">\u05D0|$A$\u05D0</pre>",
-            GetSelectionTextFromBody(modifier.Selection().AsSelection()));
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_test.cc b/third_party/blink/renderer/core/editing/selection_modifier_test.cc
index 25d7690..35e4b4a5 100644
--- a/third_party/blink/renderer/core/editing/selection_modifier_test.cc
+++ b/third_party/blink/renderer/core/editing/selection_modifier_test.cc
@@ -21,48 +21,6 @@
   EXPECT_EQ(SelectionInDOMTree(), modifier.Selection().AsSelection());
 }
 
-TEST_F(SelectionModifierTest, leftPositionOf) {
-  // TODO(editing-dev): The behavior is for editable text only.
-  // Enable it in LayoutNG phase 2+.
-  ScopedLayoutNGForTest scoped_layout_ng(false);
-
-  const char* body_content =
-      "<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b "
-      "id=three>333</b>";
-  const char* shadow_content =
-      "<b id=four>4444</b><content select=#two></content><content "
-      "select=#one></content><b id=five>55555</b>";
-  SetBodyContent(body_content);
-  ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host");
-
-  Element* one = GetDocument().getElementById("one");
-  Element* two = GetDocument().getElementById("two");
-  Element* three = GetDocument().getElementById("three");
-  Element* four = shadow_root->getElementById("four");
-  Element* five = shadow_root->getElementById("five");
-
-  EXPECT_EQ(
-      Position(two->firstChild(), 1),
-      LeftPositionOf(CreateVisiblePosition(Position(one, 0))).DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(two->firstChild(), 1),
-            LeftPositionOf(CreateVisiblePosition(PositionInFlatTree(one, 0)))
-                .DeepEquivalent());
-
-  EXPECT_EQ(
-      Position(one->firstChild(), 0),
-      LeftPositionOf(CreateVisiblePosition(Position(two, 0))).DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(four->firstChild(), 3),
-            LeftPositionOf(CreateVisiblePosition(PositionInFlatTree(two, 0)))
-                .DeepEquivalent());
-
-  EXPECT_EQ(Position(two->firstChild(), 2),
-            LeftPositionOf(CreateVisiblePosition(Position(three, 0)))
-                .DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(five->firstChild(), 5),
-            LeftPositionOf(CreateVisiblePosition(PositionInFlatTree(three, 0)))
-                .DeepEquivalent());
-}
-
 TEST_F(SelectionModifierTest, MoveForwardByWordNone) {
   SetBodyContent("abc");
   SelectionModifier modifier(GetFrame(), SelectionInDOMTree());
@@ -72,52 +30,4 @@
   EXPECT_EQ(SelectionInDOMTree(), modifier.Selection().AsSelection());
 }
 
-TEST_F(SelectionModifierTest, rightPositionOf) {
-  // TODO(editing-dev): The behavior is for editable text only.
-  // Enable it in LayoutNG phase 2+.
-  ScopedLayoutNGForTest scoped_layout_ng(false);
-
-  const char* body_content =
-      "<b id=zero>0</b><p id=host><b id=one>1</b><b id=two>22</b></p><b "
-      "id=three>333</b>";
-  const char* shadow_content =
-      "<p id=four>4444</p><content select=#two></content><content "
-      "select=#one></content><p id=five>55555</p>";
-  SetBodyContent(body_content);
-  ShadowRoot* shadow_root = SetShadowContent(shadow_content, "host");
-
-  Node* one = GetDocument().getElementById("one")->firstChild();
-  Node* two = GetDocument().getElementById("two")->firstChild();
-  Node* three = GetDocument().getElementById("three")->firstChild();
-  Node* four = shadow_root->getElementById("four")->firstChild();
-  Node* five = shadow_root->getElementById("five")->firstChild();
-
-  EXPECT_EQ(Position(), RightPositionOf(CreateVisiblePosition(Position(one, 1)))
-                            .DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(five, 0),
-            RightPositionOf(CreateVisiblePosition(PositionInFlatTree(one, 1)))
-                .DeepEquivalent());
-
-  EXPECT_EQ(Position(one, 1),
-            RightPositionOf(CreateVisiblePosition(Position(two, 2)))
-                .DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(one, 1),
-            RightPositionOf(CreateVisiblePosition(PositionInFlatTree(two, 2)))
-                .DeepEquivalent());
-
-  EXPECT_EQ(Position(five, 0),
-            RightPositionOf(CreateVisiblePosition(Position(four, 4)))
-                .DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(two, 0),
-            RightPositionOf(CreateVisiblePosition(PositionInFlatTree(four, 4)))
-                .DeepEquivalent());
-
-  EXPECT_EQ(Position(),
-            RightPositionOf(CreateVisiblePosition(Position(five, 5)))
-                .DeepEquivalent());
-  EXPECT_EQ(PositionInFlatTree(three, 0),
-            RightPositionOf(CreateVisiblePosition(PositionInFlatTree(five, 5)))
-                .DeepEquivalent());
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_word.cc b/third_party/blink/renderer/core/editing/selection_modifier_word.cc
deleted file mode 100644
index 5bc1048..0000000
--- a/third_party/blink/renderer/core/editing/selection_modifier_word.cc
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include "third_party/blink/renderer/core/editing/selection_modifier.h"
-
-#include "third_party/blink/renderer/core/editing/editing_utilities.h"
-#include "third_party/blink/renderer/core/editing/inline_box_position.h"
-#include "third_party/blink/renderer/core/editing/visible_position.h"
-#include "third_party/blink/renderer/core/editing/visible_units.h"
-#include "third_party/blink/renderer/core/layout/line/inline_text_box.h"
-#include "third_party/blink/renderer/core/layout/line/root_inline_box.h"
-#include "third_party/blink/renderer/platform/text/text_break_iterator.h"
-
-namespace blink {
-
-namespace {
-
-// This class holds a list of |InlineBox| in logical order.
-// TDOO(editing-dev): We should utilize |CachedLogicallyOrderedLeafBoxes| class
-// in |CompositeEditCommand::DeleteInsignificantText()|.
-class CachedLogicallyOrderedLeafBoxes final {
- public:
-  CachedLogicallyOrderedLeafBoxes() = default;
-
-  const InlineTextBox* PreviousTextBox(const RootInlineBox*,
-                                       const InlineTextBox*);
-  const InlineTextBox* NextTextBox(const RootInlineBox*, const InlineTextBox*);
-
-  size_t size() const { return leaf_boxes_.size(); }
-  const InlineBox* FirstBox() const { return leaf_boxes_[0]; }
-
- private:
-  const Vector<InlineBox*>& CollectBoxes(const RootInlineBox*);
-  int BoxIndexInLeaves(const InlineTextBox*) const;
-
-  const RootInlineBox* root_inline_box_ = nullptr;
-  Vector<InlineBox*> leaf_boxes_;
-};
-
-const InlineTextBox* CachedLogicallyOrderedLeafBoxes::PreviousTextBox(
-    const RootInlineBox* root,
-    const InlineTextBox* box) {
-  if (!root)
-    return nullptr;
-
-  CollectBoxes(root);
-
-  // If box is null, root is box's previous RootInlineBox, and previousBox is
-  // the last logical box in root.
-  int box_index = leaf_boxes_.size() - 1;
-  if (box)
-    box_index = BoxIndexInLeaves(box) - 1;
-
-  for (int i = box_index; i >= 0; --i) {
-    if (leaf_boxes_[i]->IsInlineTextBox())
-      return ToInlineTextBox(leaf_boxes_[i]);
-  }
-
-  return nullptr;
-}
-
-const InlineTextBox* CachedLogicallyOrderedLeafBoxes::NextTextBox(
-    const RootInlineBox* root,
-    const InlineTextBox* box) {
-  if (!root)
-    return nullptr;
-
-  CollectBoxes(root);
-
-  // If box is null, root is box's next RootInlineBox, and nextBox is the first
-  // logical box in root. Otherwise, root is box's RootInlineBox, and nextBox is
-  // the next logical box in the same line.
-  wtf_size_t next_box_index = 0;
-  if (box)
-    next_box_index = BoxIndexInLeaves(box) + 1;
-
-  for (wtf_size_t i = next_box_index; i < leaf_boxes_.size(); ++i) {
-    if (leaf_boxes_[i]->IsInlineTextBox())
-      return ToInlineTextBox(leaf_boxes_[i]);
-  }
-
-  return nullptr;
-}
-
-const Vector<InlineBox*>& CachedLogicallyOrderedLeafBoxes::CollectBoxes(
-    const RootInlineBox* root) {
-  if (root_inline_box_ != root) {
-    root_inline_box_ = root;
-    leaf_boxes_.clear();
-    root->CollectLeafBoxesInLogicalOrder(leaf_boxes_);
-  }
-  return leaf_boxes_;
-}
-
-int CachedLogicallyOrderedLeafBoxes::BoxIndexInLeaves(
-    const InlineTextBox* box) const {
-  for (wtf_size_t i = 0; i < leaf_boxes_.size(); ++i) {
-    if (box == leaf_boxes_[i])
-      return i;
-  }
-  return 0;
-}
-
-const InlineTextBox* LogicallyPreviousBox(
-    const VisiblePosition& visible_position,
-    const InlineTextBox* text_box,
-    bool& previous_box_in_different_block,
-    CachedLogicallyOrderedLeafBoxes& leaf_boxes) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  const InlineBox* start_box = text_box;
-
-  const InlineTextBox* previous_box =
-      leaf_boxes.PreviousTextBox(&start_box->Root(), text_box);
-  if (previous_box)
-    return previous_box;
-
-  previous_box =
-      leaf_boxes.PreviousTextBox(start_box->Root().PrevRootBox(), nullptr);
-  if (previous_box)
-    return previous_box;
-
-  for (;;) {
-    Node* start_node = start_box->GetLineLayoutItem().NonPseudoNode();
-    if (!start_node)
-      break;
-
-    Position position =
-        PreviousRootInlineBoxCandidatePosition(start_node, visible_position);
-    if (position.IsNull())
-      break;
-
-    const InlineBox* inline_box =
-        ComputeInlineBoxPosition(
-            PositionWithAffinity(position, TextAffinity::kDownstream))
-            .inline_box;
-    if (!inline_box)
-      break;
-
-    const RootInlineBox& previous_root = inline_box->Root();
-    previous_box = leaf_boxes.PreviousTextBox(&previous_root, nullptr);
-    if (previous_box) {
-      previous_box_in_different_block = true;
-      return previous_box;
-    }
-
-    if (!leaf_boxes.size())
-      break;
-    start_box = leaf_boxes.FirstBox();
-  }
-  return nullptr;
-}
-
-const InlineTextBox* LogicallyNextBox(
-    const VisiblePosition& visible_position,
-    const InlineTextBox* text_box,
-    bool& next_box_in_different_block,
-    CachedLogicallyOrderedLeafBoxes& leaf_boxes) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  const InlineBox* start_box = text_box;
-
-  const InlineTextBox* next_box =
-      leaf_boxes.NextTextBox(&start_box->Root(), text_box);
-  if (next_box)
-    return next_box;
-
-  next_box = leaf_boxes.NextTextBox(start_box->Root().NextRootBox(), nullptr);
-  if (next_box)
-    return next_box;
-
-  for (;;) {
-    Node* start_node = start_box->GetLineLayoutItem().NonPseudoNode();
-    if (!start_node)
-      break;
-
-    Position position =
-        NextRootInlineBoxCandidatePosition(start_node, visible_position);
-    if (position.IsNull())
-      break;
-
-    const InlineBox* inline_box =
-        ComputeInlineBoxPosition(
-            PositionWithAffinity(position, TextAffinity::kDownstream))
-            .inline_box;
-    if (!inline_box)
-      break;
-
-    const RootInlineBox& next_root = inline_box->Root();
-    next_box = leaf_boxes.NextTextBox(&next_root, nullptr);
-    if (next_box) {
-      next_box_in_different_block = true;
-      return next_box;
-    }
-
-    if (!leaf_boxes.size())
-      break;
-    start_box = leaf_boxes.FirstBox();
-  }
-  return nullptr;
-}
-
-TextBreakIterator* WordBreakIteratorForMinOffsetBoundary(
-    const VisiblePosition& visible_position,
-    const InlineTextBox* text_box,
-    int& previous_box_length,
-    bool& previous_box_in_different_block,
-    Vector<UChar, 1024>& string,
-    CachedLogicallyOrderedLeafBoxes& leaf_boxes) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  previous_box_in_different_block = false;
-
-  // TODO(editing-dev) Handle the case when we don't have an inline text box.
-  const InlineTextBox* previous_box = LogicallyPreviousBox(
-      visible_position, text_box, previous_box_in_different_block, leaf_boxes);
-
-  int len = 0;
-  string.clear();
-  if (previous_box) {
-    previous_box_length = previous_box->Len();
-    previous_box->GetLineLayoutItem().GetText().AppendTo(
-        string, previous_box->Start(), previous_box_length);
-    len += previous_box_length;
-  }
-  text_box->GetLineLayoutItem().GetText().AppendTo(string, text_box->Start(),
-                                                   text_box->Len());
-  len += text_box->Len();
-
-  return WordBreakIterator(base::make_span(string).first(len));
-}
-
-TextBreakIterator* WordBreakIteratorForMaxOffsetBoundary(
-    const VisiblePosition& visible_position,
-    const InlineTextBox* text_box,
-    bool& next_box_in_different_block,
-    Vector<UChar, 1024>& string,
-    CachedLogicallyOrderedLeafBoxes& leaf_boxes) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  next_box_in_different_block = false;
-
-  // TODO(editing-dev) Handle the case when we don't have an inline text box.
-  const InlineTextBox* next_box = LogicallyNextBox(
-      visible_position, text_box, next_box_in_different_block, leaf_boxes);
-
-  int len = 0;
-  string.clear();
-  text_box->GetLineLayoutItem().GetText().AppendTo(string, text_box->Start(),
-                                                   text_box->Len());
-  len += text_box->Len();
-  if (next_box) {
-    next_box->GetLineLayoutItem().GetText().AppendTo(string, next_box->Start(),
-                                                     next_box->Len());
-    len += next_box->Len();
-  }
-
-  return WordBreakIterator(base::make_span(string).first(len));
-}
-
-bool IsLogicalStartOfWord(TextBreakIterator* iter,
-                          int position,
-                          bool hard_line_break) {
-  bool boundary = hard_line_break ? true : iter->isBoundary(position);
-  if (!boundary)
-    return false;
-
-  // isWordTextBreak returns true after moving across a word and false after
-  // moving across a punctuation/space.
-  // If |iter| is already at the end before |iter->following| is called,
-  // IsWordTextBreak behaves differently depending on the ICU version. We have
-  // to check if |iter| is at the end, first.
-  // See https://ssl.icu-project.org/trac/ticket/13447 .
-  if (iter->following(position) == TextBreakIterator::DONE)
-    return false;
-  return IsWordTextBreak(iter);
-}
-
-bool IslogicalEndOfWord(TextBreakIterator* iter,
-                        int position,
-                        bool hard_line_break) {
-  bool boundary = iter->isBoundary(position);
-  return (hard_line_break || boundary) && IsWordTextBreak(iter);
-}
-
-enum CursorMovementDirection { kMoveLeft, kMoveRight };
-
-VisiblePosition VisualWordPosition(const VisiblePosition& visible_position,
-                                   CursorMovementDirection direction,
-                                   bool skips_space_when_moving_right) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  if (visible_position.IsNull())
-    return VisiblePosition();
-
-  TextDirection block_direction =
-      DirectionOfEnclosingBlockOf(visible_position.DeepEquivalent());
-  const InlineBox* previously_visited_box = nullptr;
-  VisiblePosition current = visible_position;
-  TextBreakIterator* iter = nullptr;
-
-  CachedLogicallyOrderedLeafBoxes leaf_boxes;
-  Vector<UChar, 1024> string;
-
-  for (;;) {
-    VisiblePosition adjacent_character_position = direction == kMoveRight
-                                                      ? RightPositionOf(current)
-                                                      : LeftPositionOf(current);
-    if (adjacent_character_position.DeepEquivalent() ==
-            current.DeepEquivalent() ||
-        adjacent_character_position.IsNull())
-      return VisiblePosition();
-
-    InlineBoxPosition box_position = ComputeInlineBoxPosition(
-        PositionWithAffinity(adjacent_character_position.DeepEquivalent(),
-                             TextAffinity::kUpstream));
-    const InlineBox* box = box_position.inline_box;
-    int offset_in_box = box_position.offset_in_box;
-
-    if (!box)
-      break;
-    if (!box->IsInlineTextBox()) {
-      current = adjacent_character_position;
-      continue;
-    }
-
-    const InlineTextBox* text_box = ToInlineTextBox(box);
-    int previous_box_length = 0;
-    bool previous_box_in_different_block = false;
-    bool next_box_in_different_block = false;
-    bool moving_into_new_box = previously_visited_box != box;
-
-    if (offset_in_box == box->CaretMinOffset()) {
-      iter = WordBreakIteratorForMinOffsetBoundary(
-          visible_position, text_box, previous_box_length,
-          previous_box_in_different_block, string, leaf_boxes);
-    } else if (offset_in_box == box->CaretMaxOffset()) {
-      iter = WordBreakIteratorForMaxOffsetBoundary(visible_position, text_box,
-                                                   next_box_in_different_block,
-                                                   string, leaf_boxes);
-    } else if (moving_into_new_box) {
-      iter = WordBreakIterator(text_box->GetLineLayoutItem().GetText(),
-                               text_box->Start(), text_box->Len());
-      previously_visited_box = box;
-    }
-
-    if (!iter)
-      break;
-
-    iter->first();
-    int offset_in_iterator =
-        offset_in_box - text_box->Start() + previous_box_length;
-
-    bool is_word_break;
-    bool box_has_same_directionality_as_block =
-        box->Direction() == block_direction;
-    bool moving_backward =
-        (direction == kMoveLeft && box->Direction() == TextDirection::kLtr) ||
-        (direction == kMoveRight && box->Direction() == TextDirection::kRtl);
-    if ((skips_space_when_moving_right &&
-         box_has_same_directionality_as_block) ||
-        (!skips_space_when_moving_right && moving_backward)) {
-      bool logical_start_in_layout_object =
-          offset_in_box == static_cast<int>(text_box->Start()) &&
-          previous_box_in_different_block;
-      is_word_break = IsLogicalStartOfWord(iter, offset_in_iterator,
-                                           logical_start_in_layout_object);
-    } else {
-      bool logical_end_in_layout_object =
-          offset_in_box ==
-              static_cast<int>(text_box->Start() + text_box->Len()) &&
-          next_box_in_different_block;
-      is_word_break = IslogicalEndOfWord(iter, offset_in_iterator,
-                                         logical_end_in_layout_object);
-    }
-
-    if (is_word_break) {
-      return AdjustBackwardPositionToAvoidCrossingEditingBoundaries(
-          adjacent_character_position, visible_position.DeepEquivalent());
-    }
-
-    current = adjacent_character_position;
-  }
-  return VisiblePosition();
-}
-
-}  // namespace
-
-VisiblePosition SelectionModifier::LeftWordPosition(
-    const VisiblePosition& visible_position,
-    bool skips_space_when_moving_right) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  const VisiblePosition& left_word_break = VisualWordPosition(
-      visible_position, kMoveLeft, skips_space_when_moving_right);
-  if (left_word_break.IsNotNull())
-    return left_word_break;
-  // TODO(editing-dev) How should we handle a non-editable position?
-  if (!IsEditablePosition(visible_position.DeepEquivalent()))
-    return left_word_break;
-  const TextDirection block_direction =
-      DirectionOfEnclosingBlockOf(visible_position.DeepEquivalent());
-  return block_direction == TextDirection::kLtr
-             ? StartOfEditableContent(visible_position)
-             : EndOfEditableContent(visible_position);
-}
-
-VisiblePosition SelectionModifier::RightWordPosition(
-    const VisiblePosition& visible_position,
-    bool skips_space_when_moving_right) {
-  DCHECK(visible_position.IsValid()) << visible_position;
-  const VisiblePosition& right_word_break = VisualWordPosition(
-      visible_position, kMoveRight, skips_space_when_moving_right);
-  if (right_word_break.IsNotNull())
-    return right_word_break;
-  // TODO(editing-dev) How should we handle a non-editable position?
-  if (!IsEditablePosition(visible_position.DeepEquivalent()))
-    return right_word_break;
-  const TextDirection block_direction =
-      blink::DirectionOfEnclosingBlockOf(visible_position.DeepEquivalent());
-  return block_direction == TextDirection::kLtr
-             ? EndOfEditableContent(visible_position)
-             : StartOfEditableContent(visible_position);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_word_test.cc b/third_party/blink/renderer/core/editing/selection_modifier_word_test.cc
deleted file mode 100644
index 6f51811..0000000
--- a/third_party/blink/renderer/core/editing/selection_modifier_word_test.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/editing/selection_modifier.h"
-
-#include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
-
-namespace blink {
-
-class SelectionModifierWordTest : public EditingTestBase {};
-
-// Regression test for crbug.com/856417
-TEST_F(SelectionModifierWordTest, MoveIntoInlineBlockWithBidiNoHang) {
-  const SelectionInDOMTree selection = SetSelectionTextToBody(
-      "<div contenteditable>"
-      "<span>&#x05D0;|&#x05D1;&#x05D2;</span>"
-      "<span style=\"display: inline-block\">foo</span>"
-      "</div>");
-  SelectionModifier modifier(GetFrame(), selection);
-  modifier.Modify(SelectionModifyAlteration::kMove,
-                  SelectionModifyDirection::kRight, TextGranularity::kWord);
-  // Shouldn't hang here.
-  EXPECT_EQ(
-      "<div contenteditable>"
-      "<span>\xD7\x90\xD7\x91\xD7\x92</span>"
-      "<span style=\"display: inline-block\">foo|</span>"
-      "</div>",
-      GetSelectionTextFromBody(modifier.Selection().AsSelection()));
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
index 381c08f5..beb848a 100644
--- a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
@@ -586,7 +586,10 @@
 
   FrameLoadRequest frame_request(frame->GetDocument(),
                                  request.ToResourceRequest(), target);
-  frame->Loader().StartNavigation(frame_request);
+  Frame* target_frame =
+      frame->Tree().FindOrCreateFrameForNavigation(frame_request).frame;
+  if (target_frame)
+    target_frame->Navigate(frame_request, WebFrameLoadType::kStandard);
 }
 
 bool WebPluginContainerImpl::IsRectTopmost(const WebRect& rect) {
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc
index 6e8f9663..9b4e994 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -3507,9 +3507,7 @@
   FrameLoadRequest request_with_target_start(
       local_frame->GetDocument(),
       web_url_request_with_target_start.ToResourceRequest(), "_top");
-  local_frame->Loader().StartNavigation(request_with_target_start);
-  frame_test_helpers::PumpPendingRequestsForFrameToLoad(
-      To<WebLocalFrameImpl>(web_view_impl->MainFrame()->FirstChild()));
+  local_frame->Tree().FindOrCreateFrameForNavigation(request_with_target_start);
   EXPECT_FALSE(client.DidFocusCalled());
 
   web_view_helper.Reset();  // Remove dependency on locally scoped client.
@@ -3527,8 +3525,8 @@
   FrameLoadRequest request(nullptr, web_url_request.ToResourceRequest(),
                            "_blank");
   To<LocalFrame>(web_view_impl->GetPage()->MainFrame())
-      ->Loader()
-      .StartNavigation(request);
+      ->Tree()
+      .FindOrCreateFrameForNavigation(request);
   ASSERT_TRUE(client.CreatedWebView());
   EXPECT_FALSE(client.DidFocusCalled());
 
@@ -3540,8 +3538,8 @@
   To<LocalFrame>(static_cast<WebViewImpl*>(client.CreatedWebView())
                      ->GetPage()
                      ->MainFrame())
-      ->Loader()
-      .StartNavigation(request_with_target_start);
+      ->Tree()
+      .FindOrCreateFrameForNavigation(request_with_target_start);
   EXPECT_TRUE(client.DidFocusCalled());
 
   web_view_helper.Reset();  // Remove dependency on locally scoped client.
@@ -3569,33 +3567,12 @@
   WebView* web_view_ = nullptr;
 };
 
-class NavigationPolicyWebFrameClient
-    : public frame_test_helpers::TestWebFrameClient {
- public:
-  NavigationPolicyWebFrameClient() = default;
-
-  void BeginNavigation(std::unique_ptr<WebNavigationInfo> info) override {
-    begin_navigation_called_ = true;
-    last_navigation_policy_ = info->navigation_policy;
-  }
-
-  bool BeginNavigationWasCalled() const { return begin_navigation_called_; }
-  WebNavigationPolicy LastNavigationPolicy() const {
-    return last_navigation_policy_;
-  }
-
- private:
-  WebNavigationPolicy last_navigation_policy_ = kWebNavigationPolicyCurrentTab;
-  bool begin_navigation_called_ = false;
-};
-
 TEST_F(WebViewTest,
        ReuseExistingWindowOnCreateViewUsesCorrectNavigationPolicy) {
   ViewReusingWebViewClient view_client;
-  NavigationPolicyWebFrameClient frame_client;
   frame_test_helpers::WebViewHelper web_view_helper;
   WebViewImpl* web_view_impl =
-      web_view_helper.Initialize(&frame_client, &view_client);
+      web_view_helper.Initialize(nullptr, &view_client);
   view_client.SetWebView(web_view_impl);
   LocalFrame* frame = To<LocalFrame>(web_view_impl->GetPage()->MainFrame());
 
@@ -3604,10 +3581,10 @@
   WebURLRequest web_url_request(KURL("about:blank"));
   FrameLoadRequest request(frame->GetDocument(),
                            web_url_request.ToResourceRequest(), "_blank");
-  frame->Loader().StartNavigation(request);
-  ASSERT_TRUE(frame_client.BeginNavigationWasCalled());
-  EXPECT_EQ(kWebNavigationPolicyCurrentTab,
-            frame_client.LastNavigationPolicy());
+  FrameTree::FindResult result =
+      frame->Tree().FindOrCreateFrameForNavigation(request);
+  EXPECT_EQ(frame, result.frame);
+  EXPECT_EQ(kNavigationPolicyCurrentTab, request.GetNavigationPolicy());
 }
 
 TEST_F(WebViewTest, DispatchesFocusOutFocusInOnViewToggleFocus) {
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index cb1a6950..c2631b41 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -93,7 +93,6 @@
 #include "third_party/blink/renderer/core/loader/document_loader.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/create_window.h"
-#include "third_party/blink/renderer/core/page/focus_controller.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h"
 #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h"
@@ -1523,22 +1522,9 @@
   if (!result.frame)
     return nullptr;
 
-  if (!result.new_window) {
-    Page* target_page = result.frame->GetPage();
-    if (target_page == GetFrame()->GetPage())
-      target_page->GetFocusController().SetFocusedFrame(result.frame);
-    else
-      target_page->GetChromeClient().Focus(GetFrame());
-    // Focusing can fire onblur, so check for detach.
-    if (!result.frame->GetPage())
-      return nullptr;
-  }
-
   if ((!completed_url.IsEmpty() || result.new_window) &&
       !result.frame->DomWindow()->IsInsecureScriptAccess(*incumbent_window,
                                                          completed_url)) {
-    frame_request.ClearFrameName();
-    frame_request.SetNavigationPolicy(kNavigationPolicyCurrentTab);
     result.frame->Navigate(frame_request, WebFrameLoadType::kStandard);
   }
 
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 1f218a1..6418063 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -84,9 +84,8 @@
   }
 
   // The process where this frame actually lives won't have sufficient
-  // information to determine correct referrer and upgrade the url, since it
-  // won't have access to the originDocument. Do it now.
-  FrameLoader::SetReferrerForFrameRequest(frame_request);
+  // information to upgrade the url, since it won't have access to the
+  // originDocument. Do it now.
   const FetchClientSettingsObject* fetch_client_settings_object = nullptr;
   if (frame_request.OriginDocument()) {
     fetch_client_settings_object = &frame_request.OriginDocument()
diff --git a/third_party/blink/renderer/core/frame/reporting_context.cc b/third_party/blink/renderer/core/frame/reporting_context.cc
index f01eb59..2702288 100644
--- a/third_party/blink/renderer/core/frame/reporting_context.cc
+++ b/third_party/blink/renderer/core/frame/reporting_context.cc
@@ -141,17 +141,16 @@
         url,
         endpoint,
         body->documentURL() ? body->documentURL() : "",
-        body->referrer() ? body->referrer() : "",
-        body->effectiveDirective() ? body->effectiveDirective() : "",
+        body->referrer(),
+        body->blockedURL(),
         body->effectiveDirective() ? body->effectiveDirective() : "",
         body->originalPolicy() ? body->originalPolicy() : "",
+        body->sourceFile(),
+        body->sample(),
         body->disposition() ? body->disposition() : "",
-        body->blockedURL() ? body->blockedURL() : "",
-        line_number,
-        column_number,
-        body->sourceFile() ? body->sourceFile() : "",
         body->statusCode(),
-        body->sample() ? body->sample() : "");
+        line_number,
+        column_number);
   } else if (type == "deprecation") {
     // Send the deprecation report.
     const DeprecationReportBody* body =
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 378e72d..248dc820 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -152,8 +152,10 @@
 }
 
 void HTMLCanvasElement::Dispose() {
-  if (PlaceholderFrame())
+  if (PlaceholderFrame()) {
     ReleasePlaceholderFrame();
+    UnregisterPlaceholder();
+  }
 
   // We need to drop frame dispatcher, to prevent mojo calls from completing.
   frame_dispatcher_ = nullptr;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc
index 1333415c..a9914db 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -493,8 +493,14 @@
   frame_load_request.SetNavigationPolicy(submission->GetNavigationPolicy());
   frame_load_request.GetResourceRequest().SetHasUserGesture(
       LocalFrame::HasTransientUserActivation(GetDocument().GetFrame()));
-  GetDocument().GetFrame()->Navigate(frame_load_request,
-                                     WebFrameLoadType::kStandard);
+
+  Frame* target_frame = GetDocument()
+                            .GetFrame()
+                            ->Tree()
+                            .FindOrCreateFrameForNavigation(frame_load_request)
+                            .frame;
+  if (target_frame)
+    target_frame->Navigate(frame_load_request, WebFrameLoadType::kStandard);
 }
 
 void HTMLFormElement::reset() {
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
index b8b14d4c..ef13662a 100644
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -431,7 +431,7 @@
       target.IsEmpty() ? GetDocument().BaseTarget() : target);
   frame_request.SetNavigationPolicy(NavigationPolicyFromEvent(&event));
   if (HasRel(kRelationNoReferrer)) {
-    frame_request.SetShouldSendReferrer(kNeverSendReferrer);
+    frame_request.SetNoReferrer();
     frame_request.SetNoOpener();
   }
   if (HasRel(kRelationNoOpener))
@@ -446,11 +446,13 @@
       event.isTrusted() ? WebTriggeringEventInfo::kFromTrustedEvent
                         : WebTriggeringEventInfo::kFromUntrustedEvent);
   frame_request.SetInputStartTime(event.PlatformTimeStamp());
-  // TODO(japhet): Link clicks can be emulated via JS without a user gesture.
-  // Why doesn't this go through NavigationScheduler?
 
   frame->MaybeLogAdClickNavigation();
-  frame->Loader().StartNavigation(frame_request, WebFrameLoadType::kStandard);
+
+  Frame* target_frame =
+      frame->Tree().FindOrCreateFrameForNavigation(frame_request).frame;
+  if (target_frame)
+    target_frame->Navigate(frame_request, WebFrameLoadType::kStandard);
 }
 
 bool IsEnterKeyKeydownEvent(Event& event) {
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 06832d52..09faab9 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -473,8 +473,10 @@
   cc::ScrollSnapType new_snap_type = new_style && allows_snap_container
                                          ? new_style->GetScrollSnapType()
                                          : cc::ScrollSnapType();
-  if (old_snap_type != new_snap_type)
-    snap_coordinator->SnapContainerDidChange(*this, new_snap_type);
+  bool is_removed = !new_style;
+  if (old_snap_type != new_snap_type || is_removed) {
+    snap_coordinator->SnapContainerDidChange(*this, is_removed);
+  }
 
   cc::ScrollSnapAlign old_snap_align =
       old_style ? old_style->GetScrollSnapAlign() : cc::ScrollSnapAlign();
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.cc b/third_party/blink/renderer/core/loader/frame_load_request.cc
index df9520a0..7cd61ef3 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.cc
+++ b/third_party/blink/renderer/core/loader/frame_load_request.cc
@@ -10,10 +10,37 @@
 #include "third_party/blink/renderer/core/fileapi/public_url_manager.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
+#include "third_party/blink/renderer/platform/weborigin/security_policy.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
 namespace blink {
 
+static void SetReferrerForRequest(Document* origin_document,
+                                  ResourceRequest& request) {
+  DCHECK(origin_document);
+
+  // Always use the initiating document to generate the referrer. We need to
+  // generateReferrer(), because we haven't enforced
+  // network::mojom::ReferrerPolicy or https->http referrer suppression yet.
+  String referrer_to_use = request.ReferrerString();
+  network::mojom::ReferrerPolicy referrer_policy_to_use =
+      request.GetReferrerPolicy();
+
+  if (referrer_to_use == Referrer::ClientReferrerString())
+    referrer_to_use = origin_document->OutgoingReferrer();
+
+  if (referrer_policy_to_use == network::mojom::ReferrerPolicy::kDefault)
+    referrer_policy_to_use = origin_document->GetReferrerPolicy();
+
+  Referrer referrer = SecurityPolicy::GenerateReferrer(
+      referrer_policy_to_use, request.Url(), referrer_to_use);
+
+  // TODO(domfarolino): Stop storing ResourceRequest's generated referrer as a
+  // header and instead use a separate member. See https://crbug.com/850813.
+  request.SetHttpReferrer(referrer);
+  request.SetHTTPOriginToMatchReferrerIfNeeded();
+}
+
 FrameLoadRequest::FrameLoadRequest(Document* origin_document,
                                    const ResourceRequest& resource_request)
     : FrameLoadRequest(origin_document, resource_request, AtomicString()) {}
@@ -54,6 +81,8 @@
       origin_document->GetPublicURLManager().Resolve(
           resource_request.Url(), MakeRequest(&blob_url_token_->data));
     }
+
+    SetReferrerForRequest(origin_document_, resource_request_);
   }
 }
 
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.h b/third_party/blink/renderer/core/loader/frame_load_request.h
index cd998c52..f998781 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.h
+++ b/third_party/blink/renderer/core/loader/frame_load_request.h
@@ -98,9 +98,6 @@
   ShouldSendReferrer GetShouldSendReferrer() const {
     return should_send_referrer_;
   }
-  void SetShouldSendReferrer(ShouldSendReferrer should_send_referrer) {
-    should_send_referrer_ = should_send_referrer;
-  }
 
   const AtomicString& HrefTranslate() const { return href_translate_; }
   void SetHrefTranslate(const AtomicString& translate) {
@@ -141,6 +138,11 @@
   bool IsWindowOpen() const { return is_window_open_; }
 
   void SetNoOpener() { window_features_.noopener = true; }
+  void SetNoReferrer() {
+    should_send_referrer_ = kNeverSendReferrer;
+    resource_request_.ClearHTTPReferrer();
+    resource_request_.ClearHTTPOrigin();
+  }
 
  private:
   Member<Document> origin_document_;
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 9ec7110..9ccacda 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -497,38 +497,6 @@
   TakeObjectSnapshot();
 }
 
-// static
-void FrameLoader::SetReferrerForFrameRequest(FrameLoadRequest& frame_request) {
-  ResourceRequest& request = frame_request.GetResourceRequest();
-  Document* origin_document = frame_request.OriginDocument();
-
-  if (!origin_document)
-    return;
-  if (frame_request.GetShouldSendReferrer() == kNeverSendReferrer)
-    return;
-
-  // Always use the initiating document to generate the referrer. We need to
-  // generateReferrer(), because we haven't enforced
-  // network::mojom::ReferrerPolicy or https->http referrer suppression yet.
-  String referrer_to_use = request.ReferrerString();
-  network::mojom::ReferrerPolicy referrer_policy_to_use =
-      request.GetReferrerPolicy();
-
-  if (referrer_to_use == Referrer::ClientReferrerString())
-    referrer_to_use = origin_document->OutgoingReferrer();
-
-  if (referrer_policy_to_use == network::mojom::ReferrerPolicy::kDefault)
-    referrer_policy_to_use = origin_document->GetReferrerPolicy();
-
-  Referrer referrer = SecurityPolicy::GenerateReferrer(
-      referrer_policy_to_use, request.Url(), referrer_to_use);
-
-  // TODO(domfarolino): Stop storing ResourceRequest's generated referrer as a
-  // header and instead use a separate member. See https://crbug.com/850813.
-  request.SetHttpReferrer(referrer);
-  request.SetHTTPOriginToMatchReferrerIfNeeded();
-}
-
 WebFrameLoadType FrameLoader::DetermineFrameLoadType(
     const KURL& url,
     const AtomicString& http_method,
@@ -581,13 +549,13 @@
   return WebFrameLoadType::kStandard;
 }
 
-bool FrameLoader::PrepareRequestForThisFrame(FrameLoadRequest& request) {
+bool FrameLoader::AllowRequestForThisFrame(const FrameLoadRequest& request) {
   // If no origin Document* was specified, skip remaining security checks and
   // assume the caller has fully initialized the FrameLoadRequest.
   if (!request.OriginDocument())
     return true;
 
-  KURL url = request.GetResourceRequest().Url();
+  const KURL& url = request.GetResourceRequest().Url();
   if (url.ProtocolIsJavaScript()) {
     Document* origin_document = request.OriginDocument();
     // Check the CSP of the caller (the "source browsing context") if required,
@@ -669,6 +637,8 @@
   CHECK(!IsBackForwardLoadType(frame_load_type));
   DCHECK(passed_request.TriggeringEventInfo() !=
          WebTriggeringEventInfo::kUnknown);
+  // Finding the correct frame must happen before calling StartNavigation().
+  DCHECK(passed_request.FrameName().IsEmpty());
 
   DCHECK(frame_->GetDocument());
   if (HTMLFrameOwnerElement* element = frame_->DeprecatedLocalOwner())
@@ -682,31 +652,9 @@
   resource_request.SetHasUserGesture(
       LocalFrame::HasTransientUserActivation(frame_));
 
-  if (!PrepareRequestForThisFrame(request))
+  if (!AllowRequestForThisFrame(request))
     return;
 
-  SetReferrerForFrameRequest(request);
-
-  // A GetNavigationPolicy() value other than kNavigationPolicyCurrentTab at
-  // this point indicates that a user event modified the navigation policy
-  // (e.g., a ctrl-click). Let the user's action override any target attribute.
-  if (request.GetNavigationPolicy() == kNavigationPolicyCurrentTab) {
-    Frame* target_frame =
-        frame_->Tree().FindOrCreateFrameForNavigation(request).frame;
-    request.SetNavigationPolicy(kNavigationPolicyCurrentTab);
-    if (!target_frame)
-      return;
-    if (target_frame != frame_) {
-      bool was_in_same_page = target_frame->GetPage() == frame_->GetPage();
-      request.ClearFrameName();
-      target_frame->Navigate(request, frame_load_type);
-      Page* page = target_frame->GetPage();
-      if (!was_in_same_page && page)
-        page->GetChromeClient().Focus(frame_);
-      return;
-    }
-  }
-
   // Block renderer-initiated loads of data: and filesystem: URLs in the top
   // frame.
   //
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h
index 308f83ef..00816e72 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.h
+++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -208,8 +208,6 @@
 
   void Trace(blink::Visitor*);
 
-  static void SetReferrerForFrameRequest(FrameLoadRequest&);
-
   void DidDropNavigation();
   void MarkAsLoading();
 
@@ -219,7 +217,7 @@
   bool ShouldReuseDefaultView(const KURL&, const ContentSecurityPolicy*);
 
  private:
-  bool PrepareRequestForThisFrame(FrameLoadRequest&);
+  bool AllowRequestForThisFrame(const FrameLoadRequest&);
   WebFrameLoadType DetermineFrameLoadType(const KURL& url,
                                           const AtomicString& http_method,
                                           Document* origin_document,
diff --git a/third_party/blink/renderer/core/page/frame_tree.cc b/third_party/blink/renderer/core/page/frame_tree.cc
index d620693..30087333 100644
--- a/third_party/blink/renderer/core/page/frame_tree.cc
+++ b/third_party/blink/renderer/core/page/frame_tree.cc
@@ -28,7 +28,9 @@
 #include "third_party/blink/renderer/core/frame/remote_frame.h"
 #include "third_party/blink/renderer/core/frame/remote_frame_view.h"
 #include "third_party/blink/renderer/core/frame/use_counter.h"
+#include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/create_window.h"
+#include "third_party/blink/renderer/core/page/focus_controller.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
 #include "third_party/blink/renderer/platform/wtf/text/cstring.h"
@@ -195,15 +197,36 @@
   DCHECK(IsA<LocalFrame>(this_frame_.Get()));
   LocalFrame* current_frame = To<LocalFrame>(this_frame_.Get());
 
+  // A GetNavigationPolicy() value other than kNavigationPolicyCurrentTab at
+  // this point indicates that a user event modified the navigation policy
+  // (e.g., a ctrl-click). Let the user's action override any target attribute.
+  if (request.GetNavigationPolicy() != kNavigationPolicyCurrentTab) {
+    request.ClearFrameName();
+    return FindResult(current_frame, false);
+  }
+
   Frame* frame = FindFrameForNavigationInternal(request);
   bool new_window = false;
   if (!frame) {
     frame = CreateNewWindow(*current_frame, request);
     new_window = true;
+    // CreateNewWindow() might have modified NavigationPolicy.
+    // Set it back now that the new window is known to be the right one.
+    request.SetNavigationPolicy(kNavigationPolicyCurrentTab);
   } else if (!current_frame->CanNavigate(*frame)) {
     frame = nullptr;
   }
 
+  request.ClearFrameName();
+  if (frame && !new_window) {
+    if (frame->GetPage() == current_frame->GetPage())
+      frame->GetPage()->GetFocusController().SetFocusedFrame(frame);
+    else
+      frame->GetPage()->GetChromeClient().Focus(current_frame);
+    // Focusing can fire onblur, so check for detach.
+    if (!frame->GetPage())
+      frame = nullptr;
+  }
   return FindResult(frame, new_window);
 }
 
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
index 3dedf85a2..1d51cad 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
@@ -103,66 +103,70 @@
 }
 
 void SnapCoordinator::UpdateSnapContainerData(LayoutBox& snap_container) {
-  if (snap_container.Style()->GetScrollSnapType().is_none)
-    return;
-
   cc::SnapContainerData snap_container_data(
       GetPhysicalSnapType(snap_container));
 
-  ScrollableArea* scrollable_area = ScrollableAreaForSnapping(snap_container);
-  if (!scrollable_area)
-    return;
-  FloatPoint max_position = scrollable_area->ScrollOffsetToPosition(
-      scrollable_area->MaximumScrollOffset());
-  snap_container_data.set_max_position(
-      gfx::ScrollOffset(max_position.X(), max_position.Y()));
+  // When snap type is 'none' we don't perform any snapping so there is no need
+  // to keep the area data up to date. So just update the type and skip updating
+  // areas as an optimization.
+  if (!snap_container_data.scroll_snap_type().is_none) {
+    ScrollableArea* scrollable_area = ScrollableAreaForSnapping(snap_container);
+    if (!scrollable_area)
+      return;
+    FloatPoint max_position = scrollable_area->ScrollOffsetToPosition(
+        scrollable_area->MaximumScrollOffset());
+    snap_container_data.set_max_position(
+        gfx::ScrollOffset(max_position.X(), max_position.Y()));
 
-  // Scroll-padding represents inward offsets from the corresponding edge of the
-  // scrollport. https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding
-  // Scrollport is the visual viewport of the scroll container (through which
-  // the scrollable overflow region can be viewed) coincides with its padding
-  // box. https://drafts.csswg.org/css-overflow-3/#scrollport. So we use the
-  // LayoutRect of the padding box here. The coordinate is relative to the
-  // container's border box.
-  LayoutRect container_rect(snap_container.PhysicalPaddingBoxRect());
+    // Scroll-padding represents inward offsets from the corresponding edge of
+    // the scrollport.
+    // https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding Scrollport is
+    // the visual viewport of the scroll container (through which the scrollable
+    // overflow region can be viewed) coincides with its padding box.
+    // https://drafts.csswg.org/css-overflow-3/#scrollport. So we use the
+    // LayoutRect of the padding box here. The coordinate is relative to the
+    // container's border box.
+    LayoutRect container_rect(snap_container.PhysicalPaddingBoxRect());
 
-  const ComputedStyle* container_style = snap_container.Style();
-  LayoutRectOutsets container_padding(
-      // The percentage of scroll-padding is different from that of normal
-      // padding, as scroll-padding resolves the percentage against
-      // corresponding dimension of the scrollport[1], while the normal padding
-      // resolves that against "width".[2,3]
-      // We use MinimumValueForLength here to ensure kAuto is resolved to
-      // LayoutUnit() which is the correct behavior for padding.
-      // [1] https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding
-      //     "relative to the corresponding dimension of the scroll container’s
-      //      scrollport"
-      // [2] https://drafts.csswg.org/css-box/#padding-props
-      // [3] See for example LayoutBoxModelObject::ComputedCSSPadding where it
-      //     uses |MinimumValueForLength| but against the "width".
-      MinimumValueForLength(container_style->ScrollPaddingTop(),
-                            container_rect.Height()),
-      MinimumValueForLength(container_style->ScrollPaddingRight(),
-                            container_rect.Width()),
-      MinimumValueForLength(container_style->ScrollPaddingBottom(),
-                            container_rect.Height()),
-      MinimumValueForLength(container_style->ScrollPaddingLeft(),
-                            container_rect.Width()));
-  container_rect.Contract(container_padding);
-  snap_container_data.set_rect(FloatRect(container_rect));
+    const ComputedStyle* container_style = snap_container.Style();
+    LayoutRectOutsets container_padding(
+        // The percentage of scroll-padding is different from that of normal
+        // padding, as scroll-padding resolves the percentage against
+        // corresponding dimension of the scrollport[1], while the normal
+        // padding resolves that against "width".[2,3] We use
+        // MinimumValueForLength here to ensure kAuto is resolved to
+        // LayoutUnit() which is the correct behavior for padding.
+        // [1] https://drafts.csswg.org/css-scroll-snap-1/#scroll-padding
+        //     "relative to the corresponding dimension of the scroll
+        //     container’s
+        //      scrollport"
+        // [2] https://drafts.csswg.org/css-box/#padding-props
+        // [3] See for example LayoutBoxModelObject::ComputedCSSPadding where it
+        //     uses |MinimumValueForLength| but against the "width".
+        MinimumValueForLength(container_style->ScrollPaddingTop(),
+                              container_rect.Height()),
+        MinimumValueForLength(container_style->ScrollPaddingRight(),
+                              container_rect.Width()),
+        MinimumValueForLength(container_style->ScrollPaddingBottom(),
+                              container_rect.Height()),
+        MinimumValueForLength(container_style->ScrollPaddingLeft(),
+                              container_rect.Width()));
+    container_rect.Contract(container_padding);
+    snap_container_data.set_rect(FloatRect(container_rect));
 
-  if (snap_container_data.scroll_snap_type().strictness ==
-      cc::SnapStrictness::kProximity) {
-    LayoutSize size = container_rect.Size();
-    size.Scale(kProximityRatio);
-    gfx::ScrollOffset range(size.Width().ToFloat(), size.Height().ToFloat());
-    snap_container_data.set_proximity_range(range);
-  }
+    if (snap_container_data.scroll_snap_type().strictness ==
+        cc::SnapStrictness::kProximity) {
+      LayoutSize size = container_rect.Size();
+      size.Scale(kProximityRatio);
+      gfx::ScrollOffset range(size.Width().ToFloat(), size.Height().ToFloat());
+      snap_container_data.set_proximity_range(range);
+    }
 
-  if (SnapAreaSet* snap_areas = snap_container.SnapAreas()) {
-    for (const LayoutBox* snap_area : *snap_areas) {
-      snap_container_data.AddSnapAreaData(
-          CalculateSnapAreaData(*snap_area, snap_container));
+    if (SnapAreaSet* snap_areas = snap_container.SnapAreas()) {
+      for (const LayoutBox* snap_area : *snap_areas) {
+        snap_container_data.AddSnapAreaData(
+            CalculateSnapAreaData(*snap_area, snap_container));
+      }
     }
   }
 
@@ -329,16 +333,29 @@
   return true;
 }
 
-void SnapCoordinator::SnapContainerDidChange(
-    LayoutBox& snap_container,
-    cc::ScrollSnapType scroll_snap_type) {
-  snap_container.SetNeedsPaintPropertyUpdate();
-  if (scroll_snap_type.is_none) {
+void SnapCoordinator::SnapContainerDidChange(LayoutBox& snap_container,
+                                             bool is_removed) {
+  if (is_removed) {
     snap_container_map_.erase(&snap_container);
-    snap_container.ClearSnapAreas();
     return;
   }
 
+  bool is_scroll_container =
+      snap_container.IsLayoutView() || snap_container.HasOverflowClip();
+  if (!is_scroll_container) {
+    snap_container_map_.erase(&snap_container);
+    snap_container.ClearSnapAreas();
+    snap_container.SetNeedsPaintPropertyUpdate();
+    return;
+  }
+
+  // Note that even if scroll snap type is 'none' we continue to maintain its
+  // snap container entry as long as the element is a scroller. This is because
+  // while the scroller does not snap, it still captures the snap areas in its
+  // subtree for whom it is the nearest  ancestor scroll container per spec [1].
+  //
+  // [1] https://drafts.csswg.org/css-scroll-snap/#overview
+
   // TODO(sunyunjia): Only update when the localframe doesn't need layout.
   UpdateSnapContainerData(snap_container);
 
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
index 8381ad0..1003b04f 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
@@ -36,7 +36,7 @@
   ~SnapCoordinator();
   void Trace(blink::Visitor* visitor) {}
 
-  void SnapContainerDidChange(LayoutBox&, cc::ScrollSnapType);
+  void SnapContainerDidChange(LayoutBox&, bool is_removed);
   void SnapAreaDidChange(LayoutBox&, cc::ScrollSnapAlign);
 
   // Returns the SnapContainerData if the snap container has one.
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.cc b/third_party/blink/renderer/core/svg/svg_a_element.cc
index c5d1e2b..a15c7dc 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_a_element.cc
@@ -132,9 +132,6 @@
         target = AtomicString("_blank");
       event.SetDefaultHandled();
 
-      LocalFrame* frame = GetDocument().GetFrame();
-      if (!frame)
-        return;
       FrameLoadRequest frame_request(
           &GetDocument(), ResourceRequest(GetDocument().CompleteURL(url)),
           target);
@@ -142,8 +139,16 @@
       frame_request.SetTriggeringEventInfo(
           event.isTrusted() ? WebTriggeringEventInfo::kFromTrustedEvent
                             : WebTriggeringEventInfo::kFromUntrustedEvent);
-      frame->Loader().StartNavigation(frame_request,
-                                      WebFrameLoadType::kStandard);
+      if (!GetDocument().GetFrame())
+        return;
+      Frame* frame = GetDocument()
+                         .GetFrame()
+                         ->Tree()
+                         .FindOrCreateFrameForNavigation(frame_request)
+                         .frame;
+      if (!frame)
+        return;
+      frame->Navigate(frame_request, WebFrameLoadType::kStandard);
       return;
     }
   }
diff --git a/third_party/blink/renderer/core/timing/performance_layout_jank.cc b/third_party/blink/renderer/core/timing/performance_layout_jank.cc
index 141c4be..723eeaa 100644
--- a/third_party/blink/renderer/core/timing/performance_layout_jank.cc
+++ b/third_party/blink/renderer/core/timing/performance_layout_jank.cc
@@ -10,8 +10,9 @@
 
 namespace blink {
 
-PerformanceLayoutJank::PerformanceLayoutJank(double fraction)
-    : PerformanceEntry(g_empty_atom, 0.0, 0.0), fraction_(fraction) {}
+PerformanceLayoutJank::PerformanceLayoutJank(double start_time, double fraction)
+    : PerformanceEntry(g_empty_atom, start_time, start_time),
+      fraction_(fraction) {}
 
 PerformanceLayoutJank::~PerformanceLayoutJank() = default;
 
diff --git a/third_party/blink/renderer/core/timing/performance_layout_jank.h b/third_party/blink/renderer/core/timing/performance_layout_jank.h
index 50d590d..f97eefb 100644
--- a/third_party/blink/renderer/core/timing/performance_layout_jank.h
+++ b/third_party/blink/renderer/core/timing/performance_layout_jank.h
@@ -19,7 +19,7 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  explicit PerformanceLayoutJank(double fraction);
+  PerformanceLayoutJank(double start_time, double fraction);
   ~PerformanceLayoutJank() override;
 
   AtomicString entryType() const override;
diff --git a/third_party/blink/renderer/core/timing/performance_observer_test.cc b/third_party/blink/renderer/core/timing/performance_observer_test.cc
index 86fb7a5..e41ba679 100644
--- a/third_party/blink/renderer/core/timing/performance_observer_test.cc
+++ b/third_party/blink/renderer/core/timing/performance_observer_test.cc
@@ -74,7 +74,7 @@
   EXPECT_EQ(0, NumPerformanceEntries());
 
   // add a layoutjank to performance so getEntries() returns it
-  auto* entry = MakeGarbageCollected<PerformanceLayoutJank>(1234);
+  auto* entry = MakeGarbageCollected<PerformanceLayoutJank>(0.0, 1234);
   base_->AddLayoutJankBuffer(*entry);
 
   // call observe with the buffered flag
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 8c71bc0..748e9eb 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -435,7 +435,8 @@
 
 void WindowPerformance::AddLayoutJankFraction(double jank_fraction) {
   DCHECK(RuntimeEnabledFeatures::LayoutJankAPIEnabled(GetExecutionContext()));
-  auto* entry = MakeGarbageCollected<PerformanceLayoutJank>(jank_fraction);
+  auto* entry =
+      MakeGarbageCollected<PerformanceLayoutJank>(now(), jank_fraction);
   if (HasObserverFor(PerformanceEntry::kLayoutJank))
     NotifyObserversOfEntry(*entry);
   if (ShouldBufferEntries())
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js b/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
index d2ea2f82..92835a3 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/Audits2Controller.js
@@ -199,32 +199,32 @@
   {
     setting: Common.settings.createSetting('audits2.cat_perf', true),
     configID: 'performance',
-    title: 'Performance',
-    description: 'How long does this app take to show content and become usable'
+    title: ls`Performance`,
+    description: ls`How long does this app take to show content and become usable`
   },
   {
     setting: Common.settings.createSetting('audits2.cat_pwa', true),
     configID: 'pwa',
-    title: 'Progressive Web App',
-    description: 'Does this page meet the standard of a Progressive Web App'
+    title: ls`Progressive Web App`,
+    description: ls`Does this page meet the standard of a Progressive Web App`
   },
   {
     setting: Common.settings.createSetting('audits2.cat_best_practices', true),
     configID: 'best-practices',
-    title: 'Best practices',
-    description: 'Does this page follow best practices for modern web development'
+    title: ls`Best practices`,
+    description: ls`Does this page follow best practices for modern web development`
   },
   {
     setting: Common.settings.createSetting('audits2.cat_a11y', true),
     configID: 'accessibility',
-    title: 'Accessibility',
-    description: 'Is this page usable by people with disabilities or impairments'
+    title: ls`Accessibility`,
+    description: ls`Is this page usable by people with disabilities or impairments`
   },
   {
     setting: Common.settings.createSetting('audits2.cat_seo', true),
     configID: 'seo',
-    title: 'SEO',
-    description: 'Is this page optimized for search engine results ranking'
+    title: ls`SEO`,
+    description: ls`Is this page optimized for search engine results ranking`
   },
 ];
 
@@ -262,17 +262,17 @@
       {
         label: ls`Simulated Slow 4G, 4x CPU Slowdown`,
         value: 'default',
-        title: 'Throttling is simulated, resulting in faster audit runs with similar measurement accuracy'
+        title: ls`Throttling is simulated, resulting in faster audit runs with similar measurement accuracy`
       },
       {
         label: ls`Applied Slow 4G, 4x CPU Slowdown`,
         value: 'devtools',
-        title: 'Typical DevTools throttling, with actual traffic shaping and CPU slowdown applied'
+        title: ls`Typical DevTools throttling, with actual traffic shaping and CPU slowdown applied`
       },
       {
         label: ls`No throttling`,
         value: 'off',
-        title: 'No network or CPU throttling used. (Useful when not evaluating performance)'
+        title: ls`No network or CPU throttling used. (Useful when not evaluating performance)`
       },
     ],
   },
diff --git a/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js b/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
index cd3eae4..c7eb7ccc 100644
--- a/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
+++ b/third_party/blink/renderer/devtools/front_end/audits2/Audits2StartView.js
@@ -87,10 +87,11 @@
         <header>
           <div class="audits2-logo"></div>
           <div class="audits2-start-view-text">
-            <h2>Audits</h2>
+            <h2>${ls`Audits`}</h2>
             <p>
-              Identify and fix common problems that affect your site's performance, accessibility, and user experience.
-              <span class="link" $="learn-more">Learn more</a>
+              ${ls`Identify and fix common problems that affect your site's performance,
+                accessibility, and user experience.`}
+              <span class="link" $="learn-more">${ls`Learn more`}</a>
             </p>
           </div>
         </header>
@@ -98,21 +99,21 @@
           <div class="audits2-form-section">
             <div class="audits2-form-section-label">
               <i>${deviceIcon}</i>
-              <div class="audits2-icon-label">Device</div>
+              <div class="audits2-icon-label">${ls`Device`}</div>
             </div>
             <div class="audits2-form-elements" $="device-type-form-elements"></div>
           </div>
           <div class="audits2-form-section">
             <div class="audits2-form-section-label">
               <i>${categoriesIcon}</i>
-              <div class="audits2-icon-label">Audits</div>
+              <div class="audits2-icon-label">${ls`Audits`}</div>
             </div>
             <div class="audits2-form-elements" $="categories-form-elements"></div>
           </div>
           <div class="audits2-form-section">
             <div class="audits2-form-section-label">
               <i>${throttlingIcon}</i>
-              <div class="audits2-icon-label">Throttling</div>
+              <div class="audits2-icon-label">${ls`Throttling`}</div>
             </div>
             <div class="audits2-form-elements" $="throttling-form-elements"></div>
           </div>
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
index b43c44d..c0a6fa6f 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
@@ -33,6 +33,7 @@
   void OnFocusIn() override {}
   void OnTimeUpdate() override {}
   void OnDurationChange() override {}
+  void OnSeeking() override {}
   void OnLoadingProgress() override {}
   void OnPlay() override {}
   void OnPause() override {}
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.cc b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.cc
index 261f52b..62b9925 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.cc
@@ -27,6 +27,11 @@
   UpdateTimeDisplay();
 }
 
+void MediaControlsTouchlessTimeDisplayElement::OnSeeking() {
+  current_time_ = MediaElement().currentTime();
+  UpdateTimeDisplay();
+}
+
 void MediaControlsTouchlessTimeDisplayElement::OnDurationChange() {
   duration_ = MediaElement().duration();
   UpdateTimeDisplay();
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.h b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.h
index 6a8455a..0134b091 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.h
@@ -18,6 +18,7 @@
 
   // MediaControlsTouchlessMediaEventListenerObserver overrides
   void OnTimeUpdate() override;
+  void OnSeeking() override;
   void OnDurationChange() override;
 
   void Trace(blink::Visitor* visitor) override;
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.cc b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.cc
index 57bd4a63..413ae227 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.cc
@@ -34,6 +34,11 @@
   UpdateBars();
 }
 
+void MediaControlsTouchlessTimelineElement::OnSeeking() {
+  current_time_ = MediaElement().currentTime();
+  UpdateBars();
+}
+
 void MediaControlsTouchlessTimelineElement::OnDurationChange() {
   duration_ = MediaElement().duration();
   UpdateBars();
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.h b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.h
index b1416ce9..c8a17e7 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.h
@@ -17,6 +17,7 @@
 
   // MediaControlsTouchlessMediaEventListenerObserver overrides
   void OnTimeUpdate() override;
+  void OnSeeking() override;
   void OnDurationChange() override;
   void OnLoadingProgress() override;
 
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.h b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.h
index 14fc333..9b569cc 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.h
@@ -56,6 +56,7 @@
   void OnFocusIn() override;
   void OnTimeUpdate() override {}
   void OnDurationChange() override {}
+  void OnSeeking() override {}
   void OnLoadingProgress() override {}
   void OnPlay() override;
   void OnPause() override;
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
index 9215321d..2bf9fdb 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
@@ -283,6 +283,14 @@
   EXPECT_DOUBLE_EQ(buffered / duration, loaded_bar_width / timeline_width);
   EXPECT_DOUBLE_EQ(current_time / buffered,
                    progress_bar_width / loaded_bar_width);
+
+  // Seek event should trigger a UI update as well.
+  SetBufferedRange(0);
+  MediaElement().setCurrentTime(0);
+  MediaElement().DispatchEvent(*Event::Create(event_type_names::kSeeking));
+
+  EXPECT_DOUBLE_EQ(progress_bar->getBoundingClientRect()->width(), 0);
+  EXPECT_DOUBLE_EQ(loaded_bar->getBoundingClientRect()->width(), 0);
 }
 
 TEST_F(MediaControlsTouchlessImplTest, TimeDisplay) {
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener.cc b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener.cc
index 3151645..17fc5f1 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener.cc
@@ -35,6 +35,7 @@
   media_element_->addEventListener(event_type_names::kTimeupdate, this, false);
   media_element_->addEventListener(event_type_names::kDurationchange, this,
                                    false);
+  media_element_->addEventListener(event_type_names::kSeeking, this, false);
   media_element_->addEventListener(event_type_names::kProgress, this, false);
 
   media_element_->addEventListener(event_type_names::kPlay, this, false);
@@ -76,6 +77,11 @@
       observer->OnDurationChange();
     return;
   }
+  if (event->type() == event_type_names::kSeeking) {
+    for (auto& observer : observers_)
+      observer->OnSeeking();
+    return;
+  }
   if (event->type() == event_type_names::kProgress) {
     for (auto& observer : observers_)
       observer->OnLoadingProgress();
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener_observer.h b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener_observer.h
index 1c297a9..cf07510 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener_observer.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_media_event_listener_observer.h
@@ -17,6 +17,7 @@
   virtual void OnFocusIn() = 0;
   virtual void OnTimeUpdate() = 0;
   virtual void OnDurationChange() = 0;
+  virtual void OnSeeking() = 0;
   virtual void OnLoadingProgress() = 0;
   virtual void OnPlay() = 0;
   virtual void OnPause() = 0;
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc
index 837a69b..21226d3 100644
--- a/third_party/blink/renderer/modules/xr/xr.cc
+++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -137,6 +137,11 @@
   environment_provider_error_callbacks_.push_back(std::move(callback));
 }
 
+void XR::ExitPresent() {
+  DCHECK(device_);
+  device_->ExitPresent();
+}
+
 ScriptPromise XR::supportsSession(ScriptState* script_state,
                                   const String& mode) {
   LocalFrame* frame = GetFrame();
@@ -194,6 +199,7 @@
   device::mojom::blink::XRSessionOptionsPtr session_options =
       convertModeToMojo(query->mode);
 
+  outstanding_support_queries_.insert(query);
   device_->SupportsSession(
       std::move(session_options),
       WTF::Bind(&XR::OnSupportsSessionReturned, WrapPersistent(this),
@@ -297,6 +303,7 @@
   // WebXR, either pass in the correct value for metrics to know whether
   // this was triggered by device activation, or remove the value as soon as
   // legacy API has been removed.
+  outstanding_request_queries_.insert(query);
   device_->RequestSession(
       std::move(session_options), false /* triggered by display activate */,
       WTF::Bind(&XR::OnRequestSessionReturned, WrapWeakPersistent(this),
@@ -330,6 +337,8 @@
   pending_device_ = false;
   if (device) {
     device_ = std::move(device);
+    device_.set_connection_error_handler(
+        WTF::Bind(&XR::OnDeviceDisconnect, WrapWeakPersistent(this)));
 
     // Log metrics
     if (!did_log_returned_device_ || !did_log_supports_immersive_) {
@@ -372,6 +381,11 @@
 
 void XR::OnSupportsSessionReturned(PendingSessionQuery* query,
                                    bool supports_session) {
+  // The session query has returned and we're about to resolve or reject the
+  // promise, so remove it from our outstanding list.
+  DCHECK(outstanding_support_queries_.Contains(query));
+  outstanding_support_queries_.erase(query);
+
   supports_session
       ? query->resolver->Resolve()
       : query->resolver->Reject(DOMException::Create(
@@ -381,6 +395,11 @@
 void XR::OnRequestSessionReturned(
     PendingSessionQuery* query,
     device::mojom::blink::XRSessionPtr session_ptr) {
+  // The session query has returned and we're about to resolve or reject the
+  // promise, so remove it from our outstanding list.
+  DCHECK(outstanding_request_queries_.Contains(query));
+  outstanding_request_queries_.erase(query);
+
   // TODO(https://crbug.com/872316) Improve the error messaging to indicate why
   // a request failed.
   if (!session_ptr) {
@@ -513,7 +532,7 @@
   if (frame_provider_)
     frame_provider_->Dispose();
 
-  device_ = nullptr;
+  OnDeviceDisconnect();
 
   // If we failed out with an outstanding call to RequestDevice, we may have
   // pending promises that need to be resolved.  Fake a call that we found no
@@ -522,6 +541,27 @@
     OnRequestDeviceReturned(nullptr);
 }
 
+void XR::OnDeviceDisconnect() {
+  if (!device_)
+    return;
+
+  device_ = nullptr;
+
+  HeapHashSet<Member<PendingSessionQuery>> support_queries =
+      outstanding_support_queries_;
+  for (const auto& query : support_queries) {
+    OnSupportsSessionReturned(query, false);
+  }
+  DCHECK(outstanding_support_queries_.IsEmpty());
+
+  HeapHashSet<Member<PendingSessionQuery>> request_queries =
+      outstanding_request_queries_;
+  for (const auto& query : request_queries) {
+    OnRequestSessionReturned(query, nullptr);
+  }
+  DCHECK(outstanding_support_queries_.IsEmpty());
+}
+
 void XR::OnEnvironmentProviderDisconnect() {
   for (auto& callback : environment_provider_error_callbacks_) {
     std::move(callback).Run();
@@ -536,6 +576,8 @@
   visitor->Trace(pending_session_requests_);
   visitor->Trace(frame_provider_);
   visitor->Trace(sessions_);
+  visitor->Trace(outstanding_support_queries_);
+  visitor->Trace(outstanding_request_queries_);
   ContextLifecycleObserver::Trace(visitor);
   EventTargetWithInlineData::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/modules/xr/xr.h b/third_party/blink/renderer/modules/xr/xr.h
index a7c2071..d1df7df4 100644
--- a/third_party/blink/renderer/modules/xr/xr.h
+++ b/third_party/blink/renderer/modules/xr/xr.h
@@ -42,9 +42,6 @@
 
   XRFrameProvider* frameProvider();
 
-  const device::mojom::blink::XRDevicePtr& xrDevicePtr() const {
-    return device_;
-  }
   const device::mojom::blink::XRFrameDataProviderPtr& xrMagicWindowProviderPtr()
       const {
     return magic_window_provider_;
@@ -73,6 +70,8 @@
   void AddEnvironmentProviderErrorHandler(
       EnvironmentProviderErrorCallback callback);
 
+  void ExitPresent();
+
   TimeTicks NavigationStart() const { return navigation_start_; }
 
  private:
@@ -117,6 +116,7 @@
 
   void Dispose();
 
+  void OnDeviceDisconnect();
   void OnEnvironmentProviderDisconnect();
 
   bool pending_device_ = false;
@@ -137,6 +137,9 @@
   HeapVector<Member<PendingSessionQuery>> pending_mode_queries_;
   HeapVector<Member<PendingSessionQuery>> pending_session_requests_;
 
+  HeapHashSet<Member<PendingSessionQuery>> outstanding_support_queries_;
+  HeapHashSet<Member<PendingSessionQuery>> outstanding_request_queries_;
+
   Vector<EnvironmentProviderErrorCallback>
       environment_provider_error_callbacks_;
 
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
index 1e780f00..a6274be8 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -149,7 +149,7 @@
   if (!immersive_session_)
     return;
 
-  xr_->xrDevicePtr()->ExitPresent();
+  xr_->ExitPresent();
 
   immersive_session_ = nullptr;
   pending_immersive_vsync_ = false;
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
index 3dd0ea23..3b3a669 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -69,11 +69,22 @@
   config.fContrast = settings_.contrast;
   default_filter_ = SkHighContrastFilter::Make(config);
 
-  if (settings_.image_style == DarkModeImageStyle::kGrayscale) {
-    config.fGrayscale = true;
-    image_filter_ = SkHighContrastFilter::Make(config);
-  } else {
-    image_filter_.reset(nullptr);
+  SkHighContrastConfig image_config = config;
+  switch (settings_.image_style) {
+    case DarkModeImageStyle::kGrayscale:
+      image_config.fGrayscale = true;
+      image_config.fInvertStyle = SkHighContrastConfig::InvertStyle::kNoInvert;
+      image_filter_ = SkHighContrastFilter::Make(image_config);
+      break;
+    case DarkModeImageStyle::kGrayscaleAndInvert:
+      DCHECK_NE(image_config.fInvertStyle,
+                SkHighContrastConfig::InvertStyle::kNoInvert);
+      image_config.fGrayscale = true;
+      image_filter_ = SkHighContrastFilter::Make(image_config);
+      break;
+    case DarkModeImageStyle::kDefault:
+      image_filter_.reset(nullptr);
+      break;
   }
 }
 
@@ -111,8 +122,8 @@
     dark_mode_flags.setColorFilter(default_filter_);
   } else {
     auto invertedColor = ApplyIfNeeded(flags.getColor());
-    dark_mode_flags.setColor(
-        SkColorSetRGB(invertedColor.Red(), invertedColor.Green(), invertedColor.Blue()));
+    dark_mode_flags.setColor(SkColorSetRGB(
+        invertedColor.Red(), invertedColor.Green(), invertedColor.Blue()));
   }
 
   return base::make_optional<cc::PaintFlags>(std::move(dark_mode_flags));
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_settings.h b/third_party/blink/renderer/platform/graphics/dark_mode_settings.h
index e67c87d..0c7c2360 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_settings.h
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_settings.h
@@ -28,10 +28,12 @@
 
 // For images that should have a filter applied, which filter should be used?
 enum class DarkModeImageStyle {
-  // Invert images the same way as other elements
+  // Invert images the same way as other elements.
   kDefault,
-  // Apply grayscale to images as well as inverting them
-  kGrayscale
+  // Apply grayscale to images that would be inverted, but don't invert them.
+  kGrayscale,
+  // Apply grayscale to images as well as inverting them.
+  kGrayscaleAndInvert
 };
 
 enum class DarkModePagePolicy {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 3949591..4d545e3 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1780,6 +1780,7 @@
 crbug.com/497522 css3/filters/backdrop-filter-boundary.html [ Failure ]
 crbug.com/497522 css3/filters/backdrop-filter-bleeding.html [ Failure ]
 crbug.com/497522 css3/filters/backdrop-filter-svg.html [ Failure ]
+crbug.com/497522 external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom.html [ Failure ]
 #crbug.com/497522 css3/filters/backdrop-filter-plus-filter.html [ Failure ]
 # This fails, but only in CAP mode:
 crbug.com/497522 external/wpt/css/filter-effects/backdrop-filter-isolation-isolate.html [ Failure ]
@@ -2902,6 +2903,16 @@
 crbug.com/939181 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Timeout ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html [ Failure ]
+crbug.com/626703 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Linux ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Mac10.10 ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Mac10.13 ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Retina ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Win ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Mac10.11 ] external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html [ Skip ]
+crbug.com/626703 [ Mac ] external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-contain/contain-size-replaced-003b.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-contain/contain-size-replaced-003c.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-contain/contain-size-replaced-003a.html [ Failure ]
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-crash-test-2.html b/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-crash-test-2.html
index 4a26e11..ac3e257 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-crash-test-2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-crash-test-2.html
@@ -9,7 +9,7 @@
 selection_test(
   '<div contenteditable><vkern></vkern><marquee><div>|abc def</div></marquee></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable><vkern></vkern><marquee><div>|abc def</div></marquee></div>',
+  '<div contenteditable><vkern></vkern><marquee><div>abc |def</div></marquee></div>',
   '1-0 left word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable><vkern></vkern><marquee><div>abc| def</div></marquee></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable><vkern></vkern><marquee><div>abc |def</div></marquee></div>',
+  '<div contenteditable><vkern></vkern><marquee><div>abc def|</div></marquee></div>',
   '1-3 right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-textarea.html b/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-textarea.html
index 072570c..eaa7f6f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-textarea.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move-by-word-visually-textarea.html
@@ -17,8 +17,8 @@
     test_move_by_word.selectionStart = 0;
     test_move_by_word.selectionEnd = 0;
 
-    var wordBreaks = [5, 10, 17, 27, 27];
-    for (var i = 0; i < 5; ++i) {
+    var wordBreaks = [5, 10, 14, 21, 27, 27];
+    for (var i = 0; i < 6; ++i) {
         var start = test_move_by_word.selectionStart;
         sel.modify('move', 'right', 'word');
         assert_equals(test_move_by_word.selectionStart, wordBreaks[i], 'word break at ' + i);
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_crossing_inline_block_boundary.html b/third_party/blink/web_tests/editing/selection/modify_move/move_crossing_inline_block_boundary.html
index 6ce7473c..3b886cf5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_crossing_inline_block_boundary.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_crossing_inline_block_boundary.html
@@ -33,11 +33,10 @@
     '<div contenteditable>foo<span style="display:inline-block;width:1em;height:1em;">|</span>bar</div>',
     'Move right into empty inline block');
 
-// TODO(xiaochengh): Note that the left and right movements are asymmetric, which might be a bug.
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block;width:1em;height:1em;">|</span>bar</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>fo|o<span style="display:inline-block;width:1em;height:1em;"></span>bar</div>',
+    '<div contenteditable>foo|<span style="display:inline-block;width:1em;height:1em;"></span>bar</div>',
     'Move left out of empty inline block');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html
index 0c12fbd..651c28487 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html
@@ -9,8 +9,6 @@
 // 3. Direction of the first line text inside the inline block
 // 4. Direction of the last line text inside the inline block
 
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable>foo|<span style="display:inline-block">bar<br>qux</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
@@ -26,9 +24,7 @@
 selection_test(
   '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1|\u05D2<br>qux</span>baz</div>'
-    : '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>qux</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>qux</span>baz</div>',
   'Move right, LTR resolved direction, RTL/LTR text inside');
 
 selection_test(
@@ -40,17 +36,13 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar<br>qux</span>\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">ba|r<br>qux</span>\u05D6\u05D7\u05D8</div>'
-    : '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>qux</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>qux</span>\u05D6\u05D7\u05D8</div>',
   'Move left, RTL resolved direction, LTR/LTR text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "qux|".
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>qux</span>|\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>q|ux</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>qu|x</span>\u05D6\u05D7\u05D8</div>',
   'Move right, RTL resolved direction, LTR/LTR text inside');
 
 selection_test(
@@ -59,12 +51,10 @@
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>qux</span>\u05D6\u05D7\u05D8</div>',
   'Move left, RTL resolved direction, RTL/LTR text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "qux|".
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>|\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>q|ux</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qu|x</span>\u05D6\u05D7\u05D8</div>',
   'Move right, RTL resolved direction, RTL/LTR text inside');
 
 selection_test(
@@ -76,35 +66,27 @@
 selection_test(
   '<div contenteditable>foo<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>|baz</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable>foo<span style="display:inline-block">bar<br>\u05D9|\u05DA\u05DB</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">bar<br>\u05D9\u05DA|\u05DB</span>baz</div>',
   'Move left, LTR resolved direction, LTR/RTL text inside');
 
 selection_test(
   '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1|\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>'
-    : '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>',
   'Move right, LTR resolved direction, RTL/RTL text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "JKL|".
 selection_test(
   '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>|baz</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9|\u05DA\u05DB</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA|\u05DB</span>baz</div>',
   'Move left, LTR resolved direction, RTL/RTL text inside');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">ba|r<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>'
-    : '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
   'Move left, RTL resolved direction, LTR/RTL text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "JKL|".
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>|\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html
index 5d0a388..31d3864 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html
@@ -8,8 +8,6 @@
 // 2. Resolved direction of the inline block in the parent context
 // 3. Direction of text inside the inline block
 
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable>foo|<span style="display:inline-block">bar</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
@@ -25,33 +23,25 @@
 selection_test(
   '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1|\u05D2</span>baz</div>'
-    : '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
   'Move right, LTR resolved direction, RTL text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "ABC|".
 selection_test(
   '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2</span>|baz</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1|\u05D2</span>baz</div>',
   'Move left, LTR resolved direction, RTL text inside');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar</span>\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">ba|r</span>\u05D6\u05D7\u05D8</div>'
-    : '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
   'Move left, RTL resolved direction, LTR text inside');
 
-// TODO(crbug.com/923087): BidiCaretAffinity currently fails this test case, as
-// VisiblePosition incorrectly moves the input position to "bar|".
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar</span>|\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">ba|r</span>\u05D6\u05D7\u05D8</div>',
   'Move right, RTL resolved direction, LTR text inside');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_ltr.html
index 1b41b3c..09dd31c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|abc</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_rtl.html
index 14c3d82..e6806e54 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_01_rtl.html
@@ -3,35 +3,28 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc</div>'
-      : '<div contenteditable dir="rtl">ab|c</div>',
+  '<div contenteditable dir="rtl">a|bc</div>',
   '1-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc</div>'
-      : '<div contenteditable dir="rtl">abc|</div>',
+  '<div contenteditable dir="rtl">ab|c</div>',
   '1-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc</div>',
+  '<div contenteditable dir="rtl">abc|</div>',
   '1-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab|c</div>'
-      : '<div contenteditable dir="rtl">abc|</div>',
+  '<div contenteditable dir="rtl">abc|</div>',
   '1-3 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_ltr.html
index 4962440..e1c142f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_ltr.html
@@ -3,35 +3,28 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
   '2-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
   '2-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
   '2-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>'
-      : '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
   '2-3 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_rtl.html
index a7126d3..94e2334a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_02_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_ltr.html
index ad308987..48f62e94 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|<br>abc</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_rtl.html
index 2350f12..e3f5c39e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_03_rtl.html
@@ -3,43 +3,34 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<br>abc</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>abc|</div>'
-      : '<div contenteditable dir="rtl"><br>|abc</div>',
+  '<div contenteditable dir="rtl"><br>|abc</div>',
   '3-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>|abc</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>|abc</div>'
-      : '<div contenteditable dir="rtl"><br>ab|c</div>',
+  '<div contenteditable dir="rtl"><br>a|bc</div>',
   '3-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>a|bc</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>|abc</div>'
-      : '<div contenteditable dir="rtl"><br>abc|</div>',
+  '<div contenteditable dir="rtl"><br>ab|c</div>',
   '3-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>ab|c</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><br>a|bc</div>',
+  '<div contenteditable dir="rtl"><br>abc|</div>',
   '3-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>abc|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>ab|c</div>'
-      : '<div contenteditable dir="rtl"><br>abc|</div>',
+  '<div contenteditable dir="rtl"><br>abc|</div>',
   '3-4 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_ltr.html
index 44a42da..b9626d23 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<br>\u05D0\u05D1\u05D2</div>',
@@ -14,30 +13,24 @@
 selection_test(
   '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr">|<br>\u05D0\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr">|<br>\u05D0\u05D1\u05D2</div>',
   '4-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
   '4-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>'
-      : '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
   '4-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|<br>\u05D0\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
   '4-4 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_rtl.html
index 93a2cfe..4b8faddc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_04_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|<br>\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_ltr.html
index 9cb88d3..28417ad 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2def</div>',
@@ -26,29 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2def</div>',
   '5-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2def</div>',
   '5-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|def</div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
   '5-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
   '5-6 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_rtl.html
index bda3a65..90435a8b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_05_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0|\u05D1\u05D2def</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
   '5-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
   '5-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2def</div>',
   '5-2 rtl left character');
 
 selection_test(
@@ -48,30 +43,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
   '5-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
   '5-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
   '5-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
   '5-9 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_ltr.html
index 6e52a74..62f73c2d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-3 ltr left character');
 
 selection_test(
@@ -48,30 +43,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc\u05d3|\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
   '6-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
   '6-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc\u05d3\u05d4\u05d5|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
   '6-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2ab|c\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
   '6-9 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_rtl.html
index e600d40..8052fcc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_06_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abc\u05d3|\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
   '6-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
   '6-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
   '6-5 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_ltr.html
index 00df74b..eb84442 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
@@ -26,48 +25,42 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
   '7-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
   '7-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5|</div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
   '7-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab|c\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
   '7-9 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_rtl.html
index 2eec1a9..78e9d989aa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_07_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-2 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_ltr.html
index 709e703..eed92ba 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2abcdef</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
   '8-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
   '8-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|abcdef</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
   '8-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
   '8-3 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_rtl.html
index c82390f..c0d2e51 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_08_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abcdef</div>',
@@ -26,48 +25,42 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|abcdef</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
   '8-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|abcdef</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
   '8-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
   '8-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
   '8-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
   '8-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
   '8-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abcde|f</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
   '8-9 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_ltr.html
index 32063491..243c4138 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_ltr.html
@@ -3,22 +3,17 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   '9-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   '9-1 ltr left character');
 
 selection_test(
@@ -30,30 +25,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   '9-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   '9-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>'
-      : '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
   '9-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
   '9-6 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_rtl.html
index 9fa78ac1..90616b0c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_09_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0661\u0662\u0663\u0627|\u0628\u0629</div>'
-      : '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   '9-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="rtl">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   '9-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   '9-2 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_ltr.html
index 5524368..34a584ea 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_ltr.html
@@ -3,42 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
   '10-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
   '10-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
   '10-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
   '10-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   '10-4 ltr left character');
 
 selection_test(
@@ -50,8 +43,6 @@
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662|\u0663</div>'
-      : '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   '10-6 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_rtl.html
index 1cdfd64..fbc0652 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_10_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
@@ -26,30 +25,24 @@
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
   '10-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   '10-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   '10-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   '10-6 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_ltr.html
index 1d68fb27..1c2ee26 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
@@ -32,37 +31,31 @@
 selection_test(
   '<div contenteditable dir="ltr"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc</span>\u05d0|\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="ltr"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   '11-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc</span>\u05d0|\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="ltr"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   '11-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
   '11-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc</span>\u05d0\u05d1\u05d2|def</div>'
-      : '<div contenteditable dir="ltr"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
   '11-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
   '11-8 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_rtl.html
index 563a455..6754522 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_11_rtl.html
@@ -3,36 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0|\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
   '11-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0|\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
   '11-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>|abc</span>\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   '11-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
   '11-3 rtl left character');
 
 selection_test(
@@ -62,30 +55,24 @@
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1\u05d2|def</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
   '11-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1\u05d2|def</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
   '11-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
   '11-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1\u05d2de|f</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
   '11-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_ltr.html
index 844a71df..fbac69d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_ltr.html
@@ -3,48 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0|\u05d1\u05d2</span>abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0|\u05d1\u05d2</span>abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2|</span>abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-5 ltr left character');
 
 selection_test(
@@ -62,30 +55,24 @@
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>abc\u05d3|\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
   '12-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
   '12-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>abc\u05d3\u05d4\u05d5|</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
   '12-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>ab|c\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
   '12-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_rtl.html
index 9e980cd3..2d5e13c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_12_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
@@ -32,31 +31,25 @@
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2</span>abc\u05d3|\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
   '12-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2</span>abc\u05d3|\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
   '12-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2|</span>abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
   '12-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
   '12-7 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_ltr.html
index eba70b29..50ad4e2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
@@ -26,29 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2|123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-6 ltr left character');
 
 selection_test(
@@ -66,29 +61,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123\u05d3|\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5def</div>',
   '13-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
   '13-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5|def</div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
   '13-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
   '13-12 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_rtl.html
index d1013b649..4da7ecb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_13_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|\u05d1\u05d2123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-2 rtl left character');
 
 selection_test(
@@ -48,23 +43,19 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123\u05d3|\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5def</div>',
   '13-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2|123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5def</div>',
   '13-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
   '13-8 rtl left character');
 
 selection_test(
@@ -88,30 +79,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5d|ef</div>',
   '13-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5de|f</div>',
   '13-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def|</div>',
   '13-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5de|f</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def|</div>',
   '13-15 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_ltr.html
index 9d4c39c..170db70 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2123</div>',
@@ -26,37 +25,31 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2123</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123</div>',
   '14-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123</div>',
   '14-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2|123</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123</div>',
   '14-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123</div>',
   '14-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D21|23</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2|123</div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123</div>',
   '14-7 ltr left character');
 
 selection_test(
@@ -68,8 +61,6 @@
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d212|3</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3</div>',
   '14-9 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_rtl.html
index 4942e68..c024a85 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_14_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|\u05d1\u05d2123</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123</div>',
   '14-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0\u05d1\u05d2123</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123</div>',
   '14-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123</div>',
   '14-2 rtl left character');
 
 selection_test(
@@ -48,30 +43,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2|123</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23</div>',
   '14-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2|123</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3</div>',
   '14-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|</div>',
   '14-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d212|3</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|</div>',
   '14-9 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_ltr.html
index 438396b..e094a3c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2123def</div>',
@@ -26,29 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123def</div>',
   '15-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123def</div>',
   '15-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2|123def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
   '15-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
   '15-6 ltr left character');
 
 selection_test(
@@ -66,7 +61,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3def</div>',
   '15-9 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_rtl.html
index 7bb332a..9dc28ec 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_15_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
   '15-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
   '15-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123def</div>',
   '15-2 rtl left character');
 
 selection_test(
@@ -48,48 +43,42 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2|123def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
   '15-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2|123def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
   '15-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
   '15-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
   '15-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
   '15-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
   '15-11 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123de|f</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
   '15-12 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_ltr.html
index e9322ed..ca93a61 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-3 ltr left character');
 
 selection_test(
@@ -48,29 +43,25 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3|\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5|abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-9 ltr left character');
 
 selection_test(
@@ -88,29 +79,25 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6|\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8|456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-15 ltr left character');
 
 selection_test(
@@ -128,30 +115,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9|\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
   '16-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
   '16-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
   '16-20 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5ab|c\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
   '16-21 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_rtl.html
index 5115964..14205ea0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_16_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3|\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-5 rtl left character');
 
 selection_test(
@@ -66,23 +61,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6|\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5|abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-11 rtl left character');
 
 selection_test(
@@ -106,23 +97,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9|\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
   '16-15 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8|456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
   '16-16 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
   '16-17 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_ltr.html
index 8e68af5..2472c15 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
@@ -50,138 +49,120 @@
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before  |  \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before   | \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    |\u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-15 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-17 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-20 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-21 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-22 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   '17-23 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   '17-24 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   '17-25 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   '17-26 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_rtl.html
index f6a5ded..602aae6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_17_rtl.html
@@ -3,46 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-5 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_ltr.html
index 097da3b8..2df5087a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_ltr.html
@@ -3,40 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '18-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '18-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '18-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   '18-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   '18-4 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_rtl.html
index 016ad93c..2b8c29b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_18_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
@@ -38,150 +37,132 @@
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '18-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9  |  after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '18-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9   | after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '18-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    |after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '18-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   '18-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   '18-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   '18-11 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   '18-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   '18-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   '18-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   '18-15 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   '18-16 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   '18-17 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   '18-18 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   '18-19 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   '18-20 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   '18-21 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   '18-22 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   '18-23 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   '18-24 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   '18-25 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   '18-26 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_ltr.html
index 676c5b3..287df2e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
@@ -50,138 +49,120 @@
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before  |  \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before   | \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    |\u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-15 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-17 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-20 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-21 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-22 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   '19-23 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   '19-24 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   '19-25 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   '19-26 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_rtl.html
index 1f31ae2d..67d5f8a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_19_rtl.html
@@ -3,46 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-5 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_ltr.html
index 6e8bc1b..732fd63 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_ltr.html
@@ -3,40 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '20-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '20-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '20-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   '20-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   '20-4 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_rtl.html
index bd47600..cd12f6b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_20_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
@@ -38,150 +37,132 @@
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '20-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9  |  after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '20-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9   | after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '20-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    |after encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '20-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   '20-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   '20-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   '20-11 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   '20-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   '20-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   '20-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   '20-15 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   '20-16 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   '20-17 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   '20-18 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   '20-19 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   '20-20 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   '20-21 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   '20-22 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   '20-23 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   '20-24 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   '20-25 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   '20-26 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_ltr.html
index 63beaec7..d3f1da9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
@@ -56,89 +55,79 @@
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-15 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-17 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   '21-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   '21-20 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_rtl.html
index 435f069..b3bc8dc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_21_rtl.html
@@ -3,53 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const isMac = navigator.platform.indexOf('Mac') === 0;
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-6 rtl left character');
 
 selection_test(
@@ -139,77 +133,55 @@
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.|</div>')
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   '21-21 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   '21-22 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   '21-23 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   '21-24 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.|</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   '21-25 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   '21-26 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   '21-27 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   '21-28 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>',
   '21-29 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_ltr.html
index f006a6b..3bb3e74 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
@@ -56,89 +55,79 @@
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-15 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-17 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   '22-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   '22-20 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_rtl.html
index f83df320..2b8d5029 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_22_rtl.html
@@ -3,53 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const isMac = navigator.platform.indexOf('Mac') === 0;
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-6 rtl left character');
 
 selection_test(
@@ -139,77 +133,55 @@
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.|</div>')
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   '22-21 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   '22-22 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   '22-23 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   '22-24 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.|</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   '22-25 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   '22-26 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   '22-27 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   '22-28 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>',
   '22-29 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_ltr.html
index f0d64a34..6dc0489 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|Lorem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_rtl.html
index 7c375636..34184fb54 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_23_rtl.html
@@ -3,244 +3,189 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>'
-    : '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
   '23-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
   '23-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
   '23-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n|        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n |       <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n  |      <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n   |     <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n    |    <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n     |   <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-11 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n      |  <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n       | <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        |<div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div>|</div>\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    // The input position is canonicalized into "|ipsum", which causes the
-    // current behavior. It might be changed in the future.
-    ? '<div contenteditable dir="rtl">Lorem\n        <div>|</div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-15 rtl left character');
 
-
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>|\n        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>|\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-16 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n|        ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n|        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-17 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n |       ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n |       ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-18 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n  |      ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n  |      ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-19 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n   |     ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n   |     ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-20 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n    |    ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n    |    ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-21 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n     |   ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n     |   ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-22 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n      |  ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n      |  ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-23 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n       | ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n       | ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-24 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-25 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
   '23-26 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
   '23-27 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
   '23-28 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
   '23-29 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
   '23-30 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_ltr.html
index fd44320..617b568 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_ltr.html
@@ -3,237 +3,183 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n|        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n|        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n |       <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n |       <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n  |      <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n  |      <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n   |     <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n   |     <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n    |    <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n    |    <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n     |   <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n     |   <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n      |  <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n      |  <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n       | <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n       | <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        |<div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        |<div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div>|</div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    // The input position is canonicalized into "|\u05DE\u05E6\u05E0\u05E4\u05EA",
-    // which causes the current behavior. It might be changed in the future.
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>|\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-15 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n|        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n |       \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-17 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n  |      \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-18 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n   |     \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-19 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n    |    \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-20 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n     |   \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-21 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n      |  \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-22 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n       | \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-23 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-24 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-25 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-26 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
   '24-27 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
   '24-28 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
   '24-29 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_rtl.html
index d67ab239..73aeef0c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_24_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'left', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_ltr.html
index 1f9c64b..de769a9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
@@ -44,54 +43,48 @@
 selection_test(
   '<div contenteditable dir="ltr">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcdef\u05d0|\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
   '25-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
   '25-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcdef\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5|</div>'
-      : '<div contenteditable dir="ltr">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
   '25-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcde|f\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
   '25-13 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_rtl.html
index b3f438e..6d0668f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_25_rtl.html
@@ -3,46 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abcdef\u05d0|\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abcdef\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-5 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_ltr.html
index d7f4b5c..767e291 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_ltr.html
@@ -3,52 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2\u05d3\u05d4\u05d5abc<img>def</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5|abc<img>def</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
   '26-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
   '26-6 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_rtl.html
index 0c5f38c..2e743d4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_26_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
@@ -44,54 +43,48 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5|abc<img>def</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
   '26-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5|abc<img>def</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
   '26-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
   '26-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
   '26-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
   '26-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
   '26-11 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
   '26-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5abc<img>de|f</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
   '26-13 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_ltr.html
index e4cd0951..0872a6c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
@@ -32,59 +31,55 @@
 selection_test(
   '<div contenteditable dir="ltr">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="ltr">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
   '27-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
   '27-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>'
-      : '<div contenteditable dir="ltr">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
   '27-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
   '27-12 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_rtl.html
index e61f5f8..acb1fcb4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_27_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="rtl">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-2 rtl left character');
 
 selection_test(
@@ -84,30 +79,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
   '27-12 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
   '27-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
   '27-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
   '27-15 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_ltr.html
index 5224f3f..26fe2781 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-3 ltr left character');
 
 selection_test(
@@ -84,30 +79,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
   '28-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
   '28-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
   '28-14 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
   '28-15 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_rtl.html
index f2512aa..c8e423d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_28_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
@@ -32,53 +31,49 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
   '28-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
   '28-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
   '28-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
   '28-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
   '28-11 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_ltr.html
index b197f893..0853d2e45 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
@@ -26,62 +25,54 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
   '29-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5|</span></div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
   '29-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab|c\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
   '29-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab|c\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
   '29-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_rtl.html
index 80fa7f92..b987cd1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_29_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-2 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_ltr.html
index 77c48d3..43a60db 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2abc<span>def</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
   '30-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
   '30-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|abc<span>def</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
   '30-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
   '30-3 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_rtl.html
index bc41af6..827a1e9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_30_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
@@ -26,62 +25,54 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|abc<span>def</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
   '30-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|abc<span>def</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
   '30-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
   '30-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
   '30-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
   '30-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
   '30-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
   '30-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abc<span>de|f</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
   '30-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abc<span>de|f</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def</span>|</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def</span>|</div>',
   '30-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_ltr.html
index b3be925..8debdc41 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
@@ -32,29 +31,25 @@
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab<span>c\u05d0|\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   '31-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab<span>c\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="ltr">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
   '31-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
   '31-7 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_rtl.html
index 1e44a60..cd7668d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_31_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0|\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|ab<span>c\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   '31-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>|c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   '31-3 rtl left character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
   '31-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
   '31-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
   '31-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
   '31-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def</span>|</div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def</span>|</div>',
   '31-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_ltr.html
index 00c3a02..1755241 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_ltr.html
@@ -3,42 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1<span>\u05d2abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2|abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>|\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2|abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-4 ltr left character');
 
 selection_test(
@@ -56,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
   '32-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
   '32-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc\u05d3\u05d4\u05d5|</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
   '32-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2ab|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
   '32-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2ab|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
   '32-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_rtl.html
index 2e47540..8bd299c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_32_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
@@ -32,23 +31,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1<span>\u05d2abc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
   '32-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1<span>\u05d2|abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
   '32-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
   '32-6 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_ltr.html
index 006ed22..964ca210 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
@@ -26,37 +25,31 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<span>\u05d0|\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<span>\u05d0|\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<span>\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="ltr">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
   '33-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
   '33-7 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_rtl.html
index 46d80a7..826682b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_33_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0|\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc<span>\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-2 rtl left character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
   '33-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
   '33-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
   '33-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
   '33-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def</span>|</div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def</span>|</div>',
   '33-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_ltr.html
index 9cbcd277..1ed5ca5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_ltr.html
@@ -3,40 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2<span>abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|<span>abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-4 ltr left character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
   '34-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
   '34-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc\u05d3\u05d4\u05d5|</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
   '34-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>ab|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
   '34-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>ab|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
   '34-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_rtl.html
index b16fd00..4398cf2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_34_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
@@ -26,31 +25,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2<span>abc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
   '34-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2<span>abc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
   '34-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|<span>abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
   '34-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
   '34-6 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_ltr.html
index 56a547a..164c53af 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0def</div>',
@@ -26,17 +25,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05D0|def</div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0def</div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0def</div>',
   '35-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05D0|def</div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0def</div>',
+  '<div contenteditable dir="ltr">abc|\u05D0def</div>',
   '35-4 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_rtl.html
index c7f53ee2..ef68535 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_35_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0|def</div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
   '35-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05D0def</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
   '35-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0def</div>',
   '35-2 rtl left character');
 
 selection_test(
@@ -36,30 +31,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
   '35-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0|def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
   '35-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0def|</div>',
   '35-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0de|f</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0def|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0def|</div>',
   '35-7 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_ltr.html
index 28c720b..217174a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_ltr.html
@@ -3,63 +3,52 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   '36-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
   '36-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
   '36-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
   '36-7 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_rtl.html
index c950e1b..5ad71e3 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_36_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
@@ -26,9 +25,7 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
   '36-3 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_ltr.html
index 3104db3d..482f101 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
@@ -26,35 +25,31 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|\u05d1\u05d2<span>def</span></div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2|<span>def</span></div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
   '37-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   '37-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   '37-7 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_rtl.html
index 8a947aa..6966314 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_37_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0|\u05D1\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-2 rtl left character');
 
 selection_test(
@@ -48,46 +43,36 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
   '37-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>|def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
   '37-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
   '37-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
   '37-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
   '37-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def</span>|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def</span>|</div>',
   '37-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_ltr.html
index a8d5ff8..3aacd024 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2abc<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|abc<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-3 ltr left character');
 
 selection_test(
@@ -48,46 +43,36 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   '38-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   '38-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
   '38-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>\u05d3\u05d4\u05d5|</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
   '38-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2ab|c<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
   '38-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2ab|c<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
   '38-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_rtl.html
index 05276330..0c1acde 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_38_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   '38-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
   '38-5 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_ltr.html
index 751e853..ef6bdbe 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
@@ -26,35 +25,31 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0|<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0<span>|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0<span>\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="ltr">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
   '39-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   '39-7 ltr left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_rtl.html
index 2d2ecd9..ceea56e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_39_rtl.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0|<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|abc\u05d0<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-2 rtl left character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
   '39-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2|def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
   '39-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
   '39-9 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
   '39-10 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2de|f</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def</span>|</div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def</span>|</div>',
   '39-11 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_ltr.html
index 9f262251..b8d809f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0|\u05d1\u05d2a<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2|a<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-3 ltr left character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   '40-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
   '40-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc\u05d3\u05d4\u05d5|</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
   '40-9 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>b|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
   '40-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>b|c\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
   '40-11 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_rtl.html
index 441937c..dd8a741 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_40_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
@@ -26,31 +25,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a<span>bc\u05d3|\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|a<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   '40-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2|a<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   '40-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
   '40-6 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_ltr.html
index dae274a..98cdafb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">|abc<!-- -->\n<!-- -->def</div>',
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_rtl.html
index 4f92a6a7..09b9164 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_41_rtl.html
@@ -3,81 +3,64 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">|abc<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">ab|c \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>',
   '41-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">a|bc<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ?  '<div contenteditable dir="rtl" style="white-space: pre;">|abc \n def</div>'
-      :  '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
+   '<div contenteditable dir="rtl" style="white-space: pre;">ab|c \n def</div>',
   '41-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">ab|c<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
   '41-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc|<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
   '41-3 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->|\n<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
   '41-4 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n|<!-- -->def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n| def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>',
   '41-5 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->|def</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>',
   '41-6 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->d|ef</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>',
   '41-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->de|f</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>',
   '41-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->def|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>',
   '41-9 rtl left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_ltr.html
index 143d2c4..52fa617 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_ltr.html
@@ -3,77 +3,64 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-2 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2|<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-3 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->|\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n|<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
   '42-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
   '42-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
   '42-7 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>',
   '42-8 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>',
   '42-9 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_rtl.html
index 28376ae..79a9fa0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_42_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">|\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_ltr.html
index b74c48e..7a0955d2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_ltr.html
@@ -3,30 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-0 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-1 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-2 ltr left character');
 
 selection_test(
@@ -38,29 +31,25 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-4 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-5 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-6 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-7 ltr left character');
 
 selection_test(
@@ -78,37 +67,31 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
   '43-10 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
   '43-11 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
   '43-12 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
   '43-13 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   '43-14 ltr left character');
 
 selection_test(
@@ -120,12 +103,12 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   '43-16 ltr left character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span>|</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   '43-17 ltr left character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_rtl.html
index 7745f5d6..6ccd6de 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_character_43_rtl.html
@@ -3,36 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-0 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-1 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-2 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-3 rtl left character');
 
 selection_test(
@@ -56,23 +49,19 @@
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
   '43-7 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
   '43-8 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
   '43-9 rtl left character');
 
 selection_test(
@@ -96,23 +85,19 @@
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
   '43-13 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   '43-14 rtl left character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
   '43-15 rtl left character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html
index 90705502..e6c34208 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_right_character_in_mixed_bidi.html
@@ -7,17 +7,12 @@
 <div id="rtl" dir="rtl" contenteditable>&#1494;&#1495; &#x202a;&#1491;&#1492;&#x202a;car &#1493;&#x202c;&#x202c;  </div>
 <div id="log"></div>
 <script>
-// When bidi caret affinity is enabled, carets are shown at different visual
-// locations. Use the changed test expectations in this case.
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-console.log(usesBidiAffinity);
-
 test(function() {
     var sample = document.getElementById('ltr');
     var selection = window.getSelection();
     selection.collapse(sample.firstChild, 6);
     selection.modify('move', 'right', 'character');
-    assert_equals(selection.anchorOffset, usesBidiAffinity ? 5 : 1);
+    assert_equals(selection.anchorOffset, 7);
 }, 'move right character');
 
 test(function() {
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_01_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_01_rtl_multi_line.html
index 415e3bd..0d830bcc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_01_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_01_rtl_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="rtl">|abc def<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-0 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-1 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-2 rtl left word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   '1-3 rtl left word');
 
 selection_test(
@@ -45,67 +45,71 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+      : '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   '1-4 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   '1-5 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   '1-6 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-7 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br>|<br><br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-8 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br>|<br>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-9 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-10 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>u|vw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-11 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uv|w xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-12 rtl left word');
 
 selection_test(
@@ -119,23 +123,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
   '1-14 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uvw x|yz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
   '1-15 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uvw xy|z</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>'
+      : '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
   '1-16 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_ltr_multi_line.html
index 79630c0..e0fe5ff 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_ltr_multi_line.html
@@ -71,43 +71,43 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div>|<div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-10 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-11 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br>|</div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-12 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div>|<div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-13 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-14 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br>|</div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-15 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-16 ltr left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_rtl_multi_line.html
index bafe6f31..91147ca 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_02_rtl_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="rtl">|abc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-0 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-1 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-2 rtl left word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      : '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-3 rtl left word');
 
 selection_test(
@@ -45,115 +45,119 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+      : '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-4 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-5 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-6 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-7 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-8 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br>|</div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-9 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div>|<div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-10 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-11 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br>|</div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-12 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div>|<div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-13 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-14 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br>|</div>uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-15 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-16 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>u|vw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-17 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uv|w xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-18 rtl left word');
 
 selection_test(
@@ -167,23 +171,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
   '2-20 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw x|yz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
   '2-21 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xy|z</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>'
-      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>'
+      : '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
   '2-22 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_ltr_multi_line.html
index a6f776c..9f1c4a1e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_ltr_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-1 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-2 ltr left word');
 
 selection_test(
@@ -41,49 +41,49 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-5 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-6 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-7 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br>|<br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-8 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br>|<br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-9 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-10 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-11 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-12 ltr left word');
 
 selection_test(
@@ -101,18 +101,18 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-15 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-16 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-17 ltr left word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_rtl_multi_line.html
index 808439ee..c056cfd 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_03_rtl_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-3 rtl left word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-4 rtl left word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-5 rtl left word');
 
 selection_test(
@@ -61,7 +61,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-6 rtl left word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-7 rtl left word');
 
 selection_test(
@@ -77,7 +77,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-8 rtl left word');
 
 selection_test(
@@ -85,7 +85,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-9 rtl left word');
 
 selection_test(
@@ -117,7 +117,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '3-13 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_ltr_multi_line.html
index 0009b0b3..925ee0d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_ltr_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-1 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-2 ltr left word');
 
 selection_test(
@@ -41,85 +41,85 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-5 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-6 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-7 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-8 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-9 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-10 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-11 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-12 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-13 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-14 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-15 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-16 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-17 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-18 ltr left word');
 
 selection_test(
@@ -137,18 +137,18 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-21 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-22 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-23 ltr left word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_rtl_multi_line.html
index 0ac6de3b5..a8feb1e2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_04_rtl_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-3 rtl left word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-4 rtl left word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-5 rtl left word');
 
 selection_test(
@@ -61,79 +61,79 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-6 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-7 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-8 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-9 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-10 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-11 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-12 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-13 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-14 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-15 rtl left word');
 
 selection_test(
@@ -165,7 +165,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '4-19 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_05_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_05_rtl_multi_line.html
index fa7ebc39c..2517edef 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_05_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_05_rtl_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0| hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc |\u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-3 rtl left word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij| \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-7 rtl left word');
 
 selection_test(
@@ -101,7 +101,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-11 rtl left word');
 
 selection_test(
@@ -133,7 +133,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-15 rtl left word');
 
 selection_test(
@@ -141,7 +141,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-16 rtl left word');
 
 selection_test(
@@ -149,7 +149,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-17 rtl left word');
 
 selection_test(
@@ -157,7 +157,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-18 rtl left word');
 
 selection_test(
@@ -165,7 +165,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-19 rtl left word');
 
 selection_test(
@@ -173,7 +173,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-20 rtl left word');
 
 selection_test(
@@ -181,7 +181,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-21 rtl left word');
 
 selection_test(
@@ -189,7 +189,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-22 rtl left word');
 
 selection_test(
@@ -221,7 +221,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj| \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-26 rtl left word');
 
 selection_test(
@@ -245,7 +245,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0| opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |opq \u05D0\u05D0\u05D0</div>',
   '5-29 rtl left word');
 
 selection_test(
@@ -277,7 +277,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq |\u05D0\u05D0\u05D0</div>',
   '5-33 rtl left word');
 
 selection_test(
@@ -309,7 +309,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq |\u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0|</div>',
   '5-37 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_ltr_multi_line.html
index 78c7c3c0..4b6c6ef 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_ltr_multi_line.html
@@ -89,13 +89,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-13 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-14 ltr left word');
 
 selection_test(
@@ -113,25 +113,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-17 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-18 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-19 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-20 ltr left word');
 
 selection_test(
@@ -197,43 +197,43 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-31 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-32 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-33 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-34 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-35 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-36 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-37 ltr left word');
 
 selection_test(
@@ -347,13 +347,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-56 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-57 ltr left word');
 
 selection_test(
@@ -371,18 +371,18 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-60 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-61 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-62 ltr left word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_rtl_multi_line.html
index 391dad9d..32accc5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_06_rtl_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0| hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc |\u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-3 rtl left word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-7 rtl left word');
 
 selection_test(
@@ -101,7 +101,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-11 rtl left word');
 
 selection_test(
@@ -133,7 +133,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-15 rtl left word');
 
 selection_test(
@@ -164,32 +164,32 @@
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-19 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-20 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 u|vw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-21 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uv|w xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-22 rtl left word');
 
 selection_test(
@@ -197,7 +197,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-23 rtl left word');
 
 selection_test(
@@ -205,103 +205,103 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-24 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw x|yz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-25 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xy|z <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-26 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-27 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz |<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-28 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-29 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-30 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-31 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-32 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-33 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-34 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-35 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-36 rtl left word');
 
 selection_test(
@@ -333,7 +333,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj| \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-40 rtl left word');
 
 selection_test(
@@ -357,7 +357,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0| mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-43 rtl left word');
 
 selection_test(
@@ -388,24 +388,24 @@
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0| mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-47 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-48 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 m|n opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-49 rtl left word');
 
 selection_test(
@@ -421,23 +421,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-51 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn o|pq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-52 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn op|q \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-53 rtl left word');
 
 selection_test(
@@ -445,7 +445,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-54 rtl left word');
 
 selection_test(
@@ -477,7 +477,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '6-58 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_07_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_07_rtl_multi_line.html
index 5335758..516f80e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_07_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_07_rtl_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-0 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-1 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-2 rtl left word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-3 rtl left word');
 
 selection_test(
@@ -45,91 +45,95 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-4 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-5 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-6 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-7 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div>|</div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-8 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div>|<div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-9 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div>|</div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-10 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div>|<div></div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-11 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div>|</div>opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-12 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-13 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>o|pq xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-14 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>op|q xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-15 rtl left word');
 
 selection_test(
@@ -143,23 +147,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
   '7-17 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq x|yz</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
   '7-18 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xy|z</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
   '7-19 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_08_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_08_rtl_multi_line.html
index 638a7478..f5e93225 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_08_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_08_rtl_multi_line.html
@@ -12,20 +12,24 @@
   '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-0 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-1 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-2 rtl left word');
 
 selection_test(
@@ -39,23 +43,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
   '8-4 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
   '8-5 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
   '8-6 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_ltr_multi_line.html
index 664ca830..5659529 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_ltr_multi_line.html
@@ -65,37 +65,37 @@
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png>|</div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-9 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png></div>|<div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-10 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png></div><div>|</div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-11 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png></div><div></div>|<div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-12 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png></div><div></div><div>|</div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-13 ltr left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>|opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="ltr">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-14 ltr left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_rtl_multi_line.html
index b62fde9..ef9546cc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_09_rtl_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="rtl">|abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-0 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-1 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-2 rtl left word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      : '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-3 rtl left word');
 
 selection_test(
@@ -45,99 +45,103 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+      : '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-4 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-5 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-6 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi|<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>',
   '9-7 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div>|<img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>',
   '9-8 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png>|</div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-9 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div>|<div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-10 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div>|</div><div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-11 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div>|<div></div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-12 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div>|</div>opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-13 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>|opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-14 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>o|pq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-15 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>op|q rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
+  isMac
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-16 rtl left word');
 
 selection_test(
@@ -151,23 +155,23 @@
   selection => selection.modify('move', 'left', 'word'),
   isMac
       ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
   '9-18 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq r|st</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
   '9-19 rtl left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rs|t</div>',
   selection => selection.modify('move', 'left', 'word'),
   isMac
-      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>'
-      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+      ? '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>'
+      : '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
   '9-20 rtl left word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_1.html
index 39c7b353c..170e884 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_1.html
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr">abc def    hij |opq</div>',
   '1-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_10.html
index ce15114c..712029b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_10.html
@@ -15,109 +15,108 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|צ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ |דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ ד|עפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דע|פ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ |   היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ  |  היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ   | היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    |היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    ה|יח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    הי|ח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח |ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח ו|פק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח ופ|ק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח ופק|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_11.html
index 5ba3e0e..8e71e578 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_11.html
@@ -15,91 +15,91 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|צ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ |דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ ד|עפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דע|פ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ |היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ ה|יח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ הי|ח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח|    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח |   abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח  |  abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח   | abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח    |abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-15 left word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr">אבצ דעפ היח    abc def |hij</div>',
   '11-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_12.html
index e556ed1..a9590d0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_12.html
@@ -105,91 +105,91 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    א|בצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij |   \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אב|צ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij |   \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij |   \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ |דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij |   \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ ד|עפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דע|פ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ |היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ ה|יח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ הי|ח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-25 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח|    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח  |  opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח   | opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-30 left word');
 
 selection_test(
@@ -258,4 +258,3 @@
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq rst |uvw</div>',
   '12-41 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_13.html
index f966a77..272716e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_13.html
@@ -9,109 +9,109 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def  |  hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def   | hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    |hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    h|ij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hi|j opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij| opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   '13-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   '13-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij o|pq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   '13-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij op|q</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   '13-17 left word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   '13-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_14.html
index f9ceba7b..ce220abe 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_14.html
@@ -9,169 +9,169 @@
 selection_test(
   '<div contenteditable dir="rtl">|    abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl"> |   abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">  |  abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">   | abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc  |  def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc   | def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    |def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    h|ij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hi|j    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij  |  opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij   | opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    |opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    o|pq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    op|q    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-27 left word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   '14-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_15.html
index 70de0e2..1c8c087 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_15.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc|    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc |   אבצ    def    </div>',
+  '<div contenteditable dir="rtl">    abc    \u05D0\u05D1\u05E6 |   def    </div>',
   '15-7 left word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    אבצ|    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    אבצ |   def    </div>',
+  '<div contenteditable dir="rtl">    abc    \u05D0\u05D1\u05E6    def|    </div>',
   '15-14 left word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl">    abc    אבצ    def|    </div>',
   '15-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_16.html
index 3ba58e1..e4792ee 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_16.html
@@ -9,43 +9,43 @@
 selection_test(
   '<div contenteditable dir="rtl">|    abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl"> |   abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">  |  abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">   | abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    |abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-6 left word');
 
 selection_test(
@@ -57,43 +57,43 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc |   def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc  |  def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc   | def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    |def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-14 left word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ|    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ |   דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '16-21 left word');
 
 selection_test(
@@ -177,43 +177,43 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    h|ij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq|    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hi|j    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq|    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-34 left word');
 
 selection_test(
@@ -225,37 +225,37 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij |   opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-36 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij  |  opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-37 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij   | opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-38 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    |opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-39 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    o|pq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-40 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    op|q    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '16-41 left word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq|    </div>',
   '16-46 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_17.html
index af39979..0b1eeef 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_17.html
@@ -9,133 +9,133 @@
 selection_test(
   '<div contenteditable dir="rtl">|    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl"> |   abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">  |  abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">   | abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc  |  def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc   | def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def  |  hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def   | hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    h|ij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hi|j    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-21 left word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-28 left word');
 
 selection_test(
@@ -219,7 +219,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-35 left word');
 
 selection_test(
@@ -261,127 +261,127 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-42 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-43 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח  |  opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-44 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח   | opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-45 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-46 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    o|pq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-47 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    op|q    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-48 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-49 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-50 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq  |  rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-51 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq   | rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-52 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-53 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    r|st    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-54 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rs|t    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-55 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-56 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-57 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst  |  uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-58 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst   | uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-59 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-60 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    u|vw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-61 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uv|w    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '17-62 left word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
   '17-67 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_18.html
index e3e0a84..d96e92a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_18.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ |   דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '18-7 left word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ |   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '18-14 left word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '18-21 left word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    ופק|    </div>',
   '18-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_19.html
index eebac237..c175ab7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_19.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ|    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ |   abc    דעפ     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    abc |   \u05D3\u05E2\u05E4     </div>',
   '19-7 left word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    abc|    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    abc |   דעפ     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4|     </div>',
   '19-14 left word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="rtl">    אבצ    abc    דעפ|     </div>',
   '19-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_2.html
index b45d5d1..8f19e62b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_2.html
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr">    abc    def    hij |   opq    </div>',
   '2-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_20.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_20.html
index 6a5c72d..471b4ab 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_20.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_20.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ |   דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-7 left word');
 
 selection_test(
@@ -93,43 +93,43 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ  |  abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ   | abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    a|bc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    ab|c   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-20 left word');
 
 selection_test(
@@ -141,37 +141,37 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc |  def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc  | def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   |def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   d|ef   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   de|f   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '20-27 left word');
 
 selection_test(
@@ -207,7 +207,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def   חיח |   ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '20-33 left word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
   '20-44 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_21.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_21.html
index 64fd5da..b059ef25 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_21.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_21.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-7 left word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-14 left word');
 
 selection_test(
@@ -135,121 +135,121 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח  |  abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח   | abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    a|bc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    ab|c   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-27 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc  | def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   d|ef   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   de|f   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-34 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-35 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def  | jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-36 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-37 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   j|ih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-38 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   ji|h   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-39 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-40 left word');
 
 selection_test(
@@ -285,7 +285,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '21-46 left word');
 
 selection_test(
@@ -315,7 +315,7 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '21-51 left word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
   '21-63 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_22.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_22.html
index 4411509..4cabe7fa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_22.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_22.html
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
   '22-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_23.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_23.html
index eee855e..22ed972a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_23.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_23.html
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '23-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_24.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_24.html
index c7d9c2ef..5a1680b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_24.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_24.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    |def    </div>',
   '24-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_25.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_25.html
index 99c09b3..cd6cb3b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_25.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_25.html
@@ -123,13 +123,13 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    א|בצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אב|צ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-20 left word');
 
 selection_test(
@@ -165,43 +165,43 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    ד|דפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דד|פ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-32 left word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
   '25-46 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_26.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_26.html
index ea172ca..c1e687b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_26.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_26.html
@@ -165,127 +165,127 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    א|בצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אב|צ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ  |  דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ   | דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-32 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    ד|עפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-33 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דע|פ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-34 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-35 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-36 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ  |  היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-37 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ   | היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-38 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-39 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    ה|יח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-40 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    הי|ח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-41 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-42 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-43 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח  |  opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-44 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח   | opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-45 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-46 left word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
   '26-67 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_27.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_27.html
index 8ffc0bc..f6fd868 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_27.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_27.html
@@ -39,169 +39,168 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    ח|יח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חי|ח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח |   ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח  |  ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח   | ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-25 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ו|פק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק|    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק  |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק   | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_28.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_28.html
index 95f1f07a..1c8c7a60 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_28.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_28.html
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
   '28-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_29.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_29.html
index 8ada3bb..35bce1e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_29.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_29.html
@@ -39,13 +39,13 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-6 left word');
 
 selection_test(
@@ -81,43 +81,43 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-18 left word');
 
 selection_test(
@@ -195,13 +195,13 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   ח|יח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חי|ח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-32 left word');
 
 selection_test(
@@ -237,43 +237,42 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ו|פק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-38 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-39 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-40 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-41 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק  |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-42 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק   | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-43 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-44 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_3.html
index b8ed927..1ac33e7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_3.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">    abc    אבצ |   def    </div>',
   '3-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_30.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_30.html
index 339824f..8c2dcf6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_30.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_30.html
@@ -39,127 +39,127 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    ח|יח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חי|ח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח  |  abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח   | abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-25 left word');
 
 selection_test(
@@ -273,121 +273,120 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ו|פק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-44 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופ|ק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-45 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-46 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-47 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-48 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ו|פק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-49 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופ|ק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-50 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-51 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-52 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק  |  רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-53 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק   | רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-54 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-55 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    ר|סת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-56 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רס|ת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-57 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-58 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת |    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-59 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת  |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-60 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת   |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-61 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת    | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-62 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-63 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_31.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_31.html
index 379c1ce..5a4f8ea 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_31.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_31.html
@@ -15,109 +15,108 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">א|בצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אב|צ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ |דעפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ ד|עפ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דע|פ    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ |   היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ  |  היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ   | היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    |היח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    ה|יח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    הי|ח ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח |ופק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ו|פק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופ|ק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופק|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_32.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_32.html
index 4f4be49..c0352534 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_32.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_32.html
@@ -15,91 +15,91 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">א|בצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אב|צ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ |דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">|\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ ד|עפ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דע|פ היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ |היח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ ה|יח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ הי|ח    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח|    abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח |   abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח  |  abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח   | abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-15 left word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc def |hij</div>',
   '32-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_33.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_33.html
index ae493ea..31c199f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_33.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_33.html
@@ -105,91 +105,91 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    א|בצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אב|צ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ |דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ ד|עפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דע|פ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ |היח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ ה|יח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ הי|ח    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-25 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח|    opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח  |  opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח   | opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-30 left word');
 
 selection_test(
@@ -258,4 +258,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq rst |uvw</div>',
   '33-41 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_34.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_34.html
index 8e35e11..818307cb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_34.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_34.html
@@ -9,109 +9,109 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">a|bc def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">ab|c def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc d|ef    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc de|f    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def |   hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def  |  hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def   | hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    h|ij opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hi|j opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   '34-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   '34-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij o|pq</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   '34-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij op|q</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   '34-17 left word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   '34-18 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_35.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_35.html
index 05dccaf3..94a45c4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_35.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_35.html
@@ -9,169 +9,169 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    h|ij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hi|j    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij |   opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij  |  opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij   | opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    o|pq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    op|q    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-27 left word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '35-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_36.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_36.html
index 59f4a10..22b0741 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_36.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_36.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    abc    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '36-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   abc    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '36-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  abc    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '36-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | abc    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '36-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc|    אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '36-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '36-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '36-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | אבצ    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '36-10 left word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ|    def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '36-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ |   def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '36-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ  |  def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '36-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ   | def    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '36-17 left word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    def    |</div>',
   '36-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_37.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_37.html
index 013d3ae..c3b0422 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_37.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_37.html
@@ -9,43 +9,43 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-6 left word');
 
 selection_test(
@@ -57,61 +57,61 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-17 left word');
 
 selection_test(
@@ -135,25 +135,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    |דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ |   דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    |דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ  |  דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    |דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ   | דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    |דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-24 left word');
 
 selection_test(
@@ -177,43 +177,43 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    h|ij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hi|j    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-34 left word');
 
 selection_test(
@@ -225,37 +225,37 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij |   opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-36 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij  |  opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-37 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij   | opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-38 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-39 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    o|pq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-40 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    op|q    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '37-41 left word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq    |</div>',
   '37-46 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_38.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_38.html
index 34f1e45..a7a34e02f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_38.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_38.html
@@ -9,151 +9,151 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    h|ij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hi|j    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij  |  אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij   | אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-24 left word');
 
 selection_test(
@@ -177,25 +177,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ  |  דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ   | דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-31 left word');
 
 selection_test(
@@ -219,25 +219,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-35 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-36 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ  |  היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-37 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ   | היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-38 left word');
 
 selection_test(
@@ -261,127 +261,127 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-42 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-43 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח  |  opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-44 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח   | opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-45 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-46 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    o|pq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-47 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    op|q    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-48 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-49 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-50 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq  |  rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-51 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq   | rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-52 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-53 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    r|st    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-54 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rs|t    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-55 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-56 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-57 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst  |  uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-58 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst   | uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-59 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-60 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    u|vw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-61 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uv|w    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '38-62 left word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
   '38-67 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_39.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_39.html
index 049823e3..5db14be 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_39.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_39.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ |   דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ  |  דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ   | דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '39-10 left word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '39-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ |   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '39-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ  |  חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '39-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ   | חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '39-17 left word');
 
 selection_test(
@@ -135,25 +135,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '39-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח |   ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '39-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח  |  ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '39-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח   | ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '39-24 left word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
   '39-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_4.html
index 0b5057aa..5e5ca52 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_4.html
@@ -123,13 +123,13 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    א|בצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אב|צ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-20 left word');
 
 selection_test(
@@ -165,43 +165,43 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    ד|דפ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דד|פ    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ |   hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ  |  hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ   | hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ    |hij    opq    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-32 left word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ    hij |   opq    </div>',
   '4-46 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_40.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_40.html
index 8a54e88..eacd24d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_40.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_40.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '40-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '40-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '40-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '40-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ|    abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '40-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ |   abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '40-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ  |  abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '40-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ   | abc    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '40-10 left word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc|    דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '40-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc |   דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '40-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc  |  דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '40-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc   | דעפ     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '40-17 left word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    דעפ     |</div>',
   '40-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_41.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_41.html
index 1584d13..c72b0cc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_41.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_41.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ |   דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ  |  דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ   | דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-10 left word');
 
 selection_test(
@@ -93,43 +93,43 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ  |  abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ   | abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    a|bc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    ab|c   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-20 left word');
 
 selection_test(
@@ -141,49 +141,49 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc |  def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc  | def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   |def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   d|ef   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   de|f   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '41-27 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '41-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def  | חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '41-29 left word');
 
 selection_test(
@@ -207,25 +207,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '41-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח |   ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '41-34 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח  |  ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '41-35 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח   | ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '41-36 left word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
   '41-44 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_42.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_42.html
index f83b42a..c2da2e3 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_42.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_42.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">|    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre"> |   אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">  |  אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">   | אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ  |  דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ   | דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-10 left word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ  |  חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ   | חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-17 left word');
 
 selection_test(
@@ -135,133 +135,133 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח  |  abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח   | abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    a|bc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    ab|c   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-27 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc  | def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   d|ef   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   de|f   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-34 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-35 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def  | jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-36 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-37 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   j|ih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-38 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   ji|h   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-39 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-40 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-41 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih  | ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-42 left word');
 
 selection_test(
@@ -285,13 +285,13 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '42-46 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '42-47 left word');
 
 selection_test(
@@ -315,25 +315,25 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '42-51 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '42-52 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק  |  רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '42-53 left word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק   | רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '42-54 left word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
   '42-63 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_43.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_43.html
index bc394a1d..4d37b88 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_43.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_43.html
@@ -156,4 +156,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     abc |def</div>',
   '43-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_5.html
index 70b30ea1..e9eeeae 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_5.html
@@ -165,127 +165,127 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    א|בצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אב|צ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ  |  דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ   | דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-32 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    ד|עפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-33 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דע|פ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-34 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-35 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-36 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ  |  היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-37 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ   | היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-38 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-39 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    ה|יח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-40 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    הי|ח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-41 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-42 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-43 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח  |  opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-44 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח   | opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-45 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-46 left word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   '5-67 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_6.html
index 2438456..85a7f3f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_6.html
@@ -39,169 +39,168 @@
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ |   דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ  |  דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ   | דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    |דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ |   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ  |  חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ   | חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    |חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    ח|יח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חי|ח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח  |  ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח   | ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    |ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-25 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ו|פק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק|    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק  |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק   | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק    |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-32 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_7.html
index b581ce6..5f54a87 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_7.html
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr">    אבצ    abc |   דעפ     </div>',
   '7-26 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_8.html
index 62ee2b4..f6833b6b6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_8.html
@@ -39,13 +39,13 @@
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-6 left word');
 
 selection_test(
@@ -81,43 +81,43 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ  |  abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ   | abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-18 left word');
 
 selection_test(
@@ -195,13 +195,13 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   ח|יח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חי|ח    ופק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-32 left word');
 
 selection_test(
@@ -237,43 +237,42 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ו|פק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-38 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-39 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-40 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-41 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק  |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-42 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק   | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-43 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-44 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_9.html
index 955b5df..5687222 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_multi_space_9.html
@@ -39,127 +39,127 @@
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ  |  דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ   | דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ  |  חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ   | חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    ח|יח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חי|ח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח  |  abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח   | abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-24 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-25 left word');
 
 selection_test(
@@ -273,121 +273,120 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ו|פק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-44 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופ|ק  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-45 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-46 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-47 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-48 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ו|פק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-49 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופ|ק    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-50 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-51 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-52 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק  |  רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-53 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק   | רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-54 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-55 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    ר|סת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-56 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רס|ת     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-57 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-58 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת |    </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-59 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת  |   </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-60 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת   |  </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-61 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת    | </div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-62 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-63 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_1.html
index 85bb8314..06959c1a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_1.html
@@ -15,13 +15,13 @@
 selection_test(
   '<div contenteditable dir="ltr">א|אא <span>בב</span></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 <span>\u05D1\u05D1</span></div>',
   '1-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א <span>בב</span></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 <span>\u05D1\u05D1</span></div>',
   '1-2 left word');
 
 selection_test(
@@ -45,13 +45,12 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא <span>ב|ב</span></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |<span>\u05D1\u05D1</span></div>',
   '1-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא <span>בב|</span></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |<span>\u05D1\u05D1</span></div>',
   '1-7 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_10.html
index b4be6bbb..d76c2da 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_10.html
@@ -15,145 +15,144 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>|היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>ה|יח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>הי|ח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח |ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ו|פק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופ|ק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק|</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>|ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש |כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_11.html
index 760affb3..a189427 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_11.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| דעפ <span dir="ltr">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |דעפ <span dir="ltr">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-3 left word');
 
 selection_test(
@@ -51,31 +51,31 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ| <span dir="ltr">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span dir="ltr">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ |<span dir="ltr">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">|abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">a|bc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">ab|c def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-11 left word');
 
 selection_test(
@@ -87,19 +87,19 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc |def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '11-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '11-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '11-15 left word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '11-20 left word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש כטז|</div>',
   '11-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_12.html
index f4ec2f9..2b95a18b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_12.html
@@ -15,55 +15,55 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc |def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">|abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-9 left word');
 
 selection_test(
@@ -117,43 +117,42 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש |כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כטז|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_13.html
index 622f4fdd..f9541f54 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_13.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-3 left word');
 
 selection_test(
@@ -51,31 +51,31 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ| <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ |<span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>|abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>a|bc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>ab|c def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-11 left word');
 
 selection_test(
@@ -87,19 +87,19 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc |def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '13-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '13-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '13-15 left word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '13-20 left word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש כטז|</div>',
   '13-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_14.html
index d30d17e..5ae2e92 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_14.html
@@ -15,13 +15,13 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-2 left word');
 
 selection_test(
@@ -39,31 +39,31 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>|abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-9 left word');
 
 selection_test(
@@ -117,13 +117,13 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-19 left word');
 
 selection_test(
@@ -141,19 +141,18 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc |def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc |def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כטז|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_15.html
index cd52c06..254ef60 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_15.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| opq דעפ <span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |opq דעפ <span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq| דעפ <span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq |דעפ <span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-7 left word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ| <span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ |<span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-11 left word');
 
 selection_test(
@@ -93,61 +93,61 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">a|bc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">ab|c אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc |אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc א|אא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אא|א def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא| def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '15-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא |def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '15-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא d|ef</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '15-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא de|f</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '15-23 left word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst |\u05DB\u05D8\u05D6</div>',
   '15-28 left word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש rst| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש rst |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6|</div>',
   '15-32 left word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש rst כטז|</div>',
   '15-36 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_16.html
index 71d45d7..d1e1a91 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_16.html
@@ -63,31 +63,31 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq ד|עפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דע|פ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">|abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-13 left word');
 
 selection_test(
@@ -111,31 +111,31 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc |אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc א|אא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אא|א def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq |דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-21 left word');
 
 selection_test(
@@ -165,25 +165,25 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ו|וש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq |דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>וו|ש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq |דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש |rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-29 left word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש rst |כטז</div>',
   '16-36 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_17.html
index 8801a892..491590e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_17.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| opq דעפ <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |opq דעפ <span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '17-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq| דעפ <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq |דעפ <span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '17-7 left word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ| <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ |<span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '17-11 left word');
 
 selection_test(
@@ -105,7 +105,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc| אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span>abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '17-16 left word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא| def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '17-20 left word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst |\u05DB\u05D8\u05D6</div>',
   '17-28 left word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש rst| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש rst |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6|</div>',
   '17-32 left word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש rst כטז|</div>',
   '17-36 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_18.html
index b41319e3..3f61a575 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_18.html
@@ -228,4 +228,3 @@
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש rst |כטז</div>',
   '18-36 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_19.html
index a7a9055..851e81aa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_19.html
@@ -69,13 +69,13 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb א|אא </span>ווש</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb |\u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9</div>',
   '19-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אא|א </span>ווש</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb |\u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9</div>',
   '19-11 left word');
 
 selection_test(
@@ -99,19 +99,18 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ו|וש</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb |אאא </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>וו|ש</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb |אאא </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ווש|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-17 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_2.html
index 051411c..15c4e233 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_2.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא| <span>בב</span></div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא |<span>בב</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 <span>\u05D1\u05D1|</span></div>',
   '2-3 left word');
 
 selection_test(
@@ -54,4 +54,3 @@
   '<div contenteditable dir="rtl">אאא <span>בב|</span></div>',
   '2-7 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_20.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_20.html
index 8a0b599..a81539b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_20.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_20.html
@@ -27,25 +27,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד |opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד o|pq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst |דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד op|q rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst |דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-6 left word');
 
 selection_test(
@@ -57,25 +57,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq |rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst |\u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq r|st דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst |\u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rs|t דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst |\u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst| דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst |דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 |<span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-11 left word');
 
 selection_test(
@@ -99,127 +99,127 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ| <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">|abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">a|bc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">ab|c uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw |\u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc |uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw |\u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc u|vw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw |\u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uv|w אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw |\u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw א|אא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אא|א def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-27 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא| def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא |def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא d|ef lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא de|f lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def |lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def l|mn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-34 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lm|n</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-35 left word');
 
 selection_test(
@@ -249,28 +249,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ| hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-40 left word');
 
-/*
- * TODO(xiaochengh): These tests currently fail on Windows.
- * Make them pass after changing left/right caret movements to logical.
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-41 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ h|ij xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz |וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-42 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hi|j xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz |וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-43 left word');
 
 selection_test(
@@ -282,26 +279,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij |xyz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz |\u05D5\u05E7\u05E7</div>',
   '20-45 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij x|yz וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz |\u05D5\u05E7\u05E7</div>',
   '20-46 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xy|z וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz |\u05D5\u05E7\u05E7</div>',
   '20-47 left word');
-*/
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz| וקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz |וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7|</div>',
   '20-48 left word');
 
 selection_test(
@@ -328,4 +324,3 @@
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק|</div>',
   '20-52 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_3.html
index 45716b3..394a734 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_3.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst |uvw</div>',
   '3-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_4.html
index 1a3c9ac..46f20d36 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_4.html
@@ -9,151 +9,151 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>|hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>h|ij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hi|j opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij o|pq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij op|q</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> r|st uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rs|t uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   '4-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   '4-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst u|vw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   '4-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uv|w</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   '4-24 left word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   '4-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_5.html
index 87de271..33b0291 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_5.html
@@ -9,151 +9,151 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">|hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">h|ij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hi|j opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij o|pq</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij op|q</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> r|st uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rs|t uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   '5-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   '5-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst u|vw</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   '5-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uv|w</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   '5-24 left word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   '5-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_6.html
index cf88c69..3f5d6b62a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_6.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst |uvw</div>',
   '6-25 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_7.html
index 9bed61f..154eebc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_7.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| דעפ <span dir="ltr">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |דעפ <span dir="ltr">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="ltr">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '7-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ| <span dir="ltr">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span dir="ltr">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '7-7 left word');
 
 selection_test(
@@ -81,7 +81,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח |ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '7-12 left word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח ופק</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '7-20 left word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח ופק</span>ווש כטז|</div>',
   '7-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_8.html
index 9a3daf6..591f3099 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_8.html
@@ -15,145 +15,144 @@
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">|היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">ה|יח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">הי|ח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח |ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ו|פק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופ|ק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק|</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>|ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש |כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_9.html
index a9b7959..340d4e4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_inline_element_9.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד |דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '9-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '9-7 left word');
 
 selection_test(
@@ -81,7 +81,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>היח |ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '9-12 left word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>היח ופק</span>ווש |כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '9-20 left word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
   '9-24 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_1.html
index db194afb..d00792d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_1.html
@@ -126,4 +126,3 @@
   '<div contenteditable dir="ltr">abc def hij opq |rst</div>',
   '1-19 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_10.html
index a43a50c..79c63cb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_10.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">aaa| אאא bbb</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">aaa |אאא bbb</div>',
+  '<div contenteditable dir="rtl">aaa \u05D0\u05D0\u05D0 |bbb</div>',
   '10-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">aaa אאא| bbb</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">aaa אאא |bbb</div>',
+  '<div contenteditable dir="rtl">aaa \u05D0\u05D0\u05D0 bbb|</div>',
   '10-7 left word');
 
 selection_test(
@@ -78,4 +78,3 @@
   '<div contenteditable dir="rtl">aaa אאא bbb|</div>',
   '10-11 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_11.html
index 2706d24..30343d61 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_11.html
@@ -15,73 +15,73 @@
 selection_test(
   '<div contenteditable dir="ltr">א|אא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא |בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא ב|בב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בב|ב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב |צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צ|צצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצ|צ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ| aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-12 left word');
 
 selection_test(
@@ -159,67 +159,66 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc ד|דד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-25 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דד|ד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-26 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-27 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד |עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-28 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד ע|עע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-29 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עע|ע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-30 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-31 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע |פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-32 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פ|פפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-33 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפ|פ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-34 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-35 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_12.html
index c0a33e4..30a4377 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_12.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא |בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב |צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-7 left word');
 
 selection_test(
@@ -75,79 +75,79 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ| aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ a|aa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aa|a bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa |bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa b|bb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bb|b ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-18 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-19 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb |ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb c|cc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb cc|c דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-22 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc| דדד עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-23 left word');
 
 selection_test(
@@ -171,7 +171,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד |עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '12-27 left word');
 
 selection_test(
@@ -195,7 +195,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד עעע |פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4|</div>',
   '12-31 left word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
   '12-35 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_13.html
index d16ccaf3..7f9e011 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_13.html
@@ -15,13 +15,13 @@
 selection_test(
   '<div contenteditable dir="ltr">א|אא בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-2 left word');
 
 selection_test(
@@ -39,25 +39,25 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא ב|בב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בב|ב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|אאא בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב| aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב |aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-8 left word');
 
 selection_test(
@@ -111,13 +111,13 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צ|צצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצ|צ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-18 left word');
 
 selection_test(
@@ -135,19 +135,18 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ ד|דד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דד|ד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דדד|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-23 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_14.html
index 39706b566..7f68652 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_14.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא| בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא |בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-3 left word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב| aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב |aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב a|aa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aa|a bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-10 left word');
 
 selection_test(
@@ -81,25 +81,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa |bbb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa b|bb צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bb|b צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bbb| צצצ דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '14-15 left word');
 
 selection_test(
@@ -123,7 +123,7 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bbb צצצ| דדד</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa bbb צצצ |דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3|</div>',
   '14-19 left word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="rtl">אאא בבב aaa bbb צצצ דדד|</div>',
   '14-23 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_15.html
index 41f0fe8..9d3dc19 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_15.html
@@ -78,4 +78,3 @@
   '<div contenteditable dir="ltr">שנב abc |סטז</div>',
   '15-11 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_16.html
index a0184a0..d8ba503 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_16.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">שנב| abc סטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">שנב |abc סטז</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E0\u05D1 abc |\u05E1\u05D8\u05D6</div>',
   '16-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">שנב abc| סטז</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">שנב abc |סטז</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E0\u05D1 abc \u05E1\u05D8\u05D6|</div>',
   '16-7 left word');
 
 selection_test(
@@ -78,4 +78,3 @@
   '<div contenteditable dir="rtl">שנב abc סטז|</div>',
   '16-11 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_17.html
index 2446614..13c9bdb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_17.html
@@ -39,31 +39,31 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u202B|באד def\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">|abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bב|אד def\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B|\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבא|ד def\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B|\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד |def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B|\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד |def\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|abc \u202Bבאד def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B|\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-9 left word');
 
 selection_test(
@@ -81,19 +81,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד def|\u202C xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C| xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-14 left word');
 
 selection_test(
@@ -114,4 +114,3 @@
   '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
   '17-17 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_18.html
index 6abbc872..edfb23a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_18.html
@@ -144,4 +144,3 @@
   '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq |rst </div>',
   '18-22 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_19.html
index 6dd36f8..277e9ef1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_19.html
@@ -234,4 +234,3 @@
   '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq |rst </div>',
   '19-37 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_2.html
index 51b8018..78a7c787 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_2.html
@@ -9,115 +9,115 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def h|ij opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hi|j opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-11 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-12 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij o|pq rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-13 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij op|q rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-14 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   '2-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   '2-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq r|st</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   '2-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq rs|t</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   '2-18 left word');
 
 selection_test(
@@ -126,4 +126,3 @@
   '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   '2-19 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_20.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_20.html
index 5766f19..be1a68c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_20.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_20.html
@@ -12,4 +12,3 @@
   '<div contenteditable dir="ltr">|</div>',
   '20-0 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_3.html
index bd4f0c2..c834bdd 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_3.html
@@ -15,115 +15,114 @@
 selection_test(
   '<div contenteditable dir="ltr">ש|שש נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">|\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-1 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">שש|ש נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">|\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-2 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">|\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-3 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש |נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">|\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-4 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נ|ננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-5 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש ננ|נ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-6 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-7 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ |בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-8 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ ב|בב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בב|ב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-10 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-11 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב |גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-12 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב ג|גג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גג|ג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|ששש נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג |קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|ששש נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג ק|קק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|ששש נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג קק|ק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">|ששש נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג קקק|</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-19 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_4.html
index 3014b057..5fafec3 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_4.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="rtl">ששש| נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">ששש |נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '4-3 left word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="rtl">ששש נננ| בבב גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">ששש נננ |בבב גגג קקק</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '4-7 left word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="rtl">ששש נננ בבב| גגג קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">ששש נננ בבב |גגג קקק</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '4-11 left word');
 
 selection_test(
@@ -99,7 +99,7 @@
 selection_test(
   '<div contenteditable dir="rtl">ששש נננ בבב גגג| קקק</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">ששש נננ בבב גגג |קקק</div>',
+  '<div contenteditable dir="rtl">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7|</div>',
   '4-15 left word');
 
 selection_test(
@@ -126,4 +126,3 @@
   '<div contenteditable dir="rtl">ששש נננ בבב גגג קקק|</div>',
   '4-19 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_5.html
index c7dd6e7..6aab6deb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_5.html
@@ -87,73 +87,73 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij א|אא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אא|א בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא |בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-16 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא ב|בב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-17 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בב|ב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-18 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-19 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב |צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-20 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צ|צצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-21 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצ|צ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-22 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ| opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-23 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-24 left word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr uvw |xyz</div>',
   '5-35 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_6.html
index f20b3fb..fb03849 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_6.html
@@ -9,73 +9,73 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-2 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-3 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-7 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-8 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def h|ij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-9 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hi|j אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-10 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij| אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-11 left word');
 
 selection_test(
@@ -99,7 +99,7 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא |בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-15 left word');
 
 selection_test(
@@ -123,7 +123,7 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב |צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '6-19 left word');
 
 selection_test(
@@ -147,73 +147,73 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ| opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-23 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-24 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ o|pr uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-25 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ op|r uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-26 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-27 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr |uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-28 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr u|vw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-29 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uv|w xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-30 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz|</div>',
   '6-31 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw |xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz|</div>',
   '6-32 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw x|yz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz|</div>',
   '6-33 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xy|z</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz|</div>',
   '6-34 left word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
   '6-35 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_7.html
index 16e480a9..96699024 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_7.html
@@ -63,13 +63,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def ש|נב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-9 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנ|ב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-10 left word');
 
 selection_test(
@@ -87,25 +87,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב ס|טז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-13 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סט|ז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-14 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סטז| uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-15 left word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סטז |uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-16 left word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="ltr">abc def שנב סטז uvw |xyz</div>',
   '7-23 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_8.html
index b92a5a0..60c653c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_8.html
@@ -9,19 +9,19 @@
 selection_test(
   '<div contenteditable dir="rtl">|abc def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-0 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-1 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-2 left word');
 
 selection_test(
@@ -33,25 +33,25 @@
 selection_test(
   '<div contenteditable dir="rtl">abc |def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-4 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-5 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-6 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-7 left word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב| סטז uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב |סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '8-11 left word');
 
 selection_test(
@@ -99,25 +99,25 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז| uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-15 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז |uvw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-16 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז u|vw xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw xyz|</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-17 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uv|w xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw xyz|</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-18 left word');
 
 selection_test(
@@ -129,19 +129,19 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw |xyz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz|</div>',
   '8-20 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw x|yz</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz|</div>',
   '8-21 left word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw xy|z</div>',
   selection => selection.modify('move', 'left', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz|</div>',
   '8-22 left word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="rtl">abc def שנב סטז uvw xyz|</div>',
   '8-23 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_9.html
index 908d326..7668dafd 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_left_word_visually_single_space_one_element_9.html
@@ -78,4 +78,3 @@
   '<div contenteditable dir="ltr">aaa אאא |bbb</div>',
   '9-11 left word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_multiline.html b/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_multiline.html
index deae747..92f27cf 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_multiline.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_multiline.html
@@ -124,13 +124,13 @@
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">אבג|<br>qux</span>baz</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">א|בג<br>qux</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">אב|ג<br>qux</span>baz</div>',
     'End of line 1, move left, LTR resolved direction, RTL/LTR text inside');
 
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">אבג|<br>יךכ</span>baz</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">א|בג<br>יךכ</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">אב|ג<br>יךכ</span>baz</div>',
     'End of line 1, move left, LTR resolved direction, RTL/RTL text inside');
 
 selection_test(
@@ -184,13 +184,13 @@
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar|<br>qux</span>זחט</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">b|ar<br>qux</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">ba|r<br>qux</span>זחט</div>',
     'End of line 1, move right, RTL resolved direction, LTR/LTR text inside');
 
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar|<br>יךכ</span>זחט</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">b|ar<br>יךכ</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">ba|r<br>יךכ</span>זחט</div>',
     'End of line 1, move right, RTL resolved direction, LTR/RTL text inside');
 
 selection_test(
@@ -232,7 +232,7 @@
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>|qux</span>זחט</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>qu|x</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>q|ux</span>זחט</div>',
     'Start of line 2, move left, RTL resolved direction, LTR/LTR text inside');
 
 selection_test(
@@ -244,7 +244,7 @@
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>|qux</span>זחט</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>qu|x</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>q|ux</span>זחט</div>',
     'Start of line 2, move left, RTL resolved direction, RTL/LTR text inside');
 
 selection_test(
@@ -262,7 +262,7 @@
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">bar<br>|יךכ</span>baz</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">bar<br>יך|כ</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">bar<br>י|ךכ</span>baz</div>',
     'Start of line 2, move right, LTR resolved direction, LTR/RTL text inside');
 
 selection_test(
@@ -274,7 +274,7 @@
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">אבג<br>|יךכ</span>baz</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">אבג<br>יך|כ</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">אבג<br>י|ךכ</span>baz</div>',
     'Start of line 2, move right, LTR resolved direction, RTL/RTL text inside');
 
 selection_test(
@@ -310,7 +310,7 @@
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">bar<br>יךכ|</span>baz</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">bar<br>י|ךכ</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">bar<br>יך|כ</span>baz</div>',
     'End of line 2, move left, LTR resolved direction, LTR/RTL text inside');
 
 selection_test(
@@ -322,7 +322,7 @@
 selection_test(
     '<div contenteditable>foo<span style="display:inline-block">אבג<br>יךכ|</span>baz</div>',
     selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>foo<span style="display:inline-block">אבג<br>י|ךכ</span>baz</div>',
+    '<div contenteditable>foo<span style="display:inline-block">אבג<br>יך|כ</span>baz</div>',
     'End of line 2, move left, LTR resolved direction, RTL/RTL text inside');
 
 selection_test(
@@ -376,7 +376,7 @@
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>qux|</span>זחט</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>q|ux</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">bar<br>qu|x</span>זחט</div>',
     'End of line 2, move right, RTL resolved direction, LTR/LTR text inside');
 
 selection_test(
@@ -388,7 +388,7 @@
 selection_test(
     '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>qux|</span>זחט</div>',
     selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>q|ux</span>זחט</div>',
+    '<div contenteditable dir="rtl">דהו<span style="display:inline-block">אבג<br>qu|x</span>זחט</div>',
     'End of line 2, move right, RTL resolved direction, RTL/LTR text inside');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_one_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_one_line.html
index 4d0f495c..bcb5cc8 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_one_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_out_of_inline_block_one_line.html
@@ -9,8 +9,6 @@
 // 2. Resolved direction of the inline block in the parent context
 // 3. Direction of text inside the inline block
 
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable>foo<span style="display:inline-block">|bar</span>baz</div>',
   selection => selection.modify('move', 'right', 'character'),
@@ -56,7 +54,7 @@
 selection_test(
   '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2|</span>baz</div>',
   selection => selection.modify('move', 'left', 'character'),
-  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1|\u05D2</span>baz</div>',
   'From end, move left, LTR resolved direction, RTL text inside');
 
 selection_test(
@@ -74,7 +72,7 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar|</span>\u05D6\u05D7\u05D8</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">ba|r</span>\u05D6\u05D7\u05D8</div>',
   'From end, move right, RTL resolved direction, LTR text inside');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_over_ignored_contents.html b/third_party/blink/web_tests/editing/selection/modify_move/move_over_ignored_contents.html
deleted file mode 100644
index bcb8366d..0000000
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_over_ignored_contents.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html>
-<script src="../../../resources/testharness.js"></script>
-<script src="../../../resources/testharnessreport.js"></script>
-<script src="../../assert_selection.js"></script>
-<script>
-selection_test(
-    '<div contenteditable>foo|<div style="float:right">float</div>bar</div>',
-    selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable>foo<div style="float:right">float</div>b|ar</div>',
-    'Move right over float');
-
-selection_test(
-    '<div contenteditable>foo<div style="float:right">float</div>|bar</div>',
-    selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>fo|o<div style="float:right">float</div>bar</div>',
-    'Move left over float');
-
-selection_test(
-    '<div contenteditable>foo|<div style="position:absolute">positioned</div>bar</div>',
-    selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable>foo<div style="position:absolute">positioned</div>b|ar</div>',
-    'Move right over out-of-flow positioned');
-
-selection_test(
-    '<div contenteditable>foo<div style="position:absolute">positioned</div>|bar</div>',
-    selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>fo|o<div style="position:absolute">positioned</div>bar</div>',
-    'Move left over out-of-flow positioned');
-
-selection_test(
-    '<div contenteditable>foo|<wbr>bar</div>',
-    selection => selection.modify('move', 'right', 'character'),
-    '<div contenteditable>foo<wbr>b|ar</div>',
-    'Move right over wbr');
-
-selection_test(
-    '<div contenteditable>foo<wbr>|bar</div>',
-    selection => selection.modify('move', 'left', 'character'),
-    '<div contenteditable>fo|o<wbr>bar</div>',
-    'Move left over wbr');
-
-selection_test(
-    `<style>span::before{content:'xxx'}</style>
-    <div contenteditable>foo|<span>bar</span></div>`,
-    selection => selection.modify('move', 'right', 'character'),
-    `<style>span::before{content:'xxx'}</style>
-    <div contenteditable>foo<span>b|ar</span></div>`,
-    'Move right over generated content');
-
-selection_test(
-    `<style>span::before{content:'xxx'}</style>
-    <div contenteditable>foo<span>|bar</span></div>`,
-    selection => selection.modify('move', 'left', 'character'),
-    `<style>span::before{content:'xxx'}</style>
-    <div contenteditable>fo|o<span>bar</span></div>`,
-    'Move left over generated content');
-</script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_ltr.html
index e013835..2053a28c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|abc</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_rtl.html
index 79fa7bb0..4375a40b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_01_rtl.html
@@ -3,35 +3,28 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc</div>'
-      : '<div contenteditable dir="rtl">|abc</div>',
+  '<div contenteditable dir="rtl">|abc</div>',
   '1-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c</div>',
+  '<div contenteditable dir="rtl">|abc</div>',
   '1-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|</div>'
-      : '<div contenteditable dir="rtl">|abc</div>',
+  '<div contenteditable dir="rtl">a|bc</div>',
   '1-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|</div>'
-      : '<div contenteditable dir="rtl">a|bc</div>',
+  '<div contenteditable dir="rtl">ab|c</div>',
   '1-3 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_ltr.html
index c0d43439..265b0a2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_ltr.html
@@ -3,35 +3,28 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
   '2-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
   '2-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
   '2-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|</div>',
   '2-3 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_rtl.html
index 6098380..b44891e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_02_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_ltr.html
index c188947d..594ea5a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|<br>abc</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_rtl.html
index 6c9b03cb..1b2cec1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_03_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<br>abc</div>',
@@ -14,30 +13,24 @@
 selection_test(
   '<div contenteditable dir="rtl"><br>|abc</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>a|bc</div>'
-      : '<div contenteditable dir="rtl">|<br>abc</div>',
+  '<div contenteditable dir="rtl">|<br>abc</div>',
   '3-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>a|bc</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><br>ab|c</div>',
+  '<div contenteditable dir="rtl"><br>|abc</div>',
   '3-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>ab|c</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><br>abc|</div>'
-      : '<div contenteditable dir="rtl"><br>|abc</div>',
+  '<div contenteditable dir="rtl"><br>a|bc</div>',
   '3-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><br>abc|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">|<br>abc</div>'
-      : '<div contenteditable dir="rtl"><br>a|bc</div>',
+  '<div contenteditable dir="rtl"><br>ab|c</div>',
   '3-4 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_ltr.html
index d5a704c1..74c623c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_ltr.html
@@ -3,43 +3,34 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<br>\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>'
-      : '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
   '4-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
   '4-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>|\u05D0\u05D1\u05D2</div>'
-      : '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
   '4-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><br>\u05D0|\u05D1\u05D2</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
   '4-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><br>\u05D0\u05D1|\u05D2</div>'
-      : '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
+  '<div contenteditable dir="ltr"><br>\u05D0\u05D1\u05D2|</div>',
   '4-4 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_rtl.html
index a29b4376..46ad4c3c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_04_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|<br>\u05D0\u05D1\u05D2</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_ltr.html
index 795e4db0..ec1b41a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2def</div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2d|ef</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
   '5-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
   '5-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|def</div>',
   '5-5 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_rtl.html
index c4a1bc6..8b12516 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_05_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
   '5-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
   '5-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
   '5-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2def</div>',
   '5-3 rtl right character');
 
 selection_test(
@@ -48,30 +43,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2d|ef</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2def</div>',
   '5-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>',
   '5-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2def|</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
   '5-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1|\u05d2def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2de|f</div>',
   '5-9 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_ltr.html
index 37055b77..1e04b67 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
   '6-2 ltr right character');
 
 selection_test(
@@ -48,30 +43,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
   '6-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
   '6-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
   '6-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc\u05d3\u05d4|\u05d5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5|</div>',
   '6-9 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_rtl.html
index 20580e1f..9f5f34d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_06_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc\u05D3\u05D4\u05D5</div>',
@@ -26,29 +25,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc\u05D3\u05D4\u05D5</div>',
   '6-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
   '6-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
   '6-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c\u05D3\u05D4\u05D5</div>',
   '6-6 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_ltr.html
index 6fec319..26c0e917 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
@@ -26,48 +25,42 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
   '7-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
   '7-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
   '7-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
   '7-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
   '7-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2\u05d3\u05d4|\u05d5</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|</div>',
   '7-9 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_rtl.html
index e141077f..eedc26b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_07_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5</div>',
   '7-3 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_ltr.html
index 5062f12..0035dc4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abcdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a|bcdef</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
   '8-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2abcdef</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abcdef</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
   '8-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abcdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abcdef</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abcdef</div>',
   '8-2 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_rtl.html
index a0061f8..d87685c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_08_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abcdef</div>',
@@ -26,48 +25,42 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abcdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a|bcdef</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abcdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abcdef</div>',
   '8-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abcdef</div>',
   '8-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
   '8-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|cdef</div>',
   '8-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|def</div>',
   '8-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abcdef|</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abcdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcd|ef</div>',
   '8-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcdef|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1|\u05d2abcdef</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bcdef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abcde|f</div>',
   '8-9 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_ltr.html
index da1d29c..2f1a72f1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_ltr.html
@@ -3,14 +3,11 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661|\u0662\u0663\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   '9-0 ltr right character');
 
 selection_test(
@@ -22,38 +19,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   '9-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661|\u0662\u0663\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
   '9-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663|\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
   '9-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627|\u0628\u0629</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
   '9-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628|\u0629</div>'
-      : '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
+  '<div contenteditable dir="ltr">\u0661\u0662\u0663\u0627\u0628\u0629|</div>',
   '9-6 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_rtl.html
index e3770fa63..931ae322 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_09_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   '9-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
   '9-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0661\u0662\u0663|\u0627\u0628\u0629</div>'
-      : '<div contenteditable dir="rtl">|\u0661\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
   '9-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0661\u0662\u0663|\u0627\u0628\u0629</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u0661|\u0662\u0663\u0627\u0628\u0629</div>',
+  '<div contenteditable dir="rtl">\u0661\u0662|\u0663\u0627\u0628\u0629</div>',
   '9-3 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_ltr.html
index d39a8d1a..79415fa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
   '10-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u0627\u0628\u0629\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
   '10-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u0627|\u0628\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   '10-2 ltr right character');
 
 selection_test(
@@ -42,16 +37,12 @@
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>'
-      : '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   '10-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u0627\u0628|\u0629\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
+  '<div contenteditable dir="ltr">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   '10-6 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_rtl.html
index 0dd23e6..feec9299 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_10_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u0627\u0628\u0629\u0661\u0662\u0663</div>',
@@ -26,30 +25,24 @@
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628|\u0629\u0661\u0662\u0663</div>',
   '10-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
   '10-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628\u0629|\u0661\u0662\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
   '10-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662\u0663|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u0627\u0628|\u0629\u0661\u0662\u0663</div>'
-      : '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661|\u0662\u0663</div>',
+  '<div contenteditable dir="rtl">\u0627\u0628\u0629\u0661\u0662|\u0663</div>',
   '10-6 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_ltr.html
index b99d1f90..669fec0e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
@@ -32,31 +31,25 @@
 selection_test(
   '<div contenteditable dir="ltr"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc</span>\u05d0\u05d1\u05d2d|ef</div>'
-      : '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
   '11-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc</span>\u05d0\u05d1\u05d2d|ef</div>'
-      : '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
   '11-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>abc|</span>\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
   '11-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><span>abc</span>\u05D0|\u05D1\u05D2def</div>',
+  '<div contenteditable dir="ltr"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
   '11-7 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_rtl.html
index a816397a..a48bd843 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_11_rtl.html
@@ -3,48 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>a|bc</span>\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl">|<span>abc</span>\u05D0\u05D1\u05D2def</div>',
   '11-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>a|bc</span>\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
   '11-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
   '11-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc|</span>\u05d0\u05d1\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>|abc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
   '11-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc|</span>\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   '11-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>|\u05D0\u05D1\u05D2def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>a|bc</span>\u05D0\u05D1\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>ab|c</span>\u05D0\u05D1\u05D2def</div>',
   '11-5 rtl right character');
 
 selection_test(
@@ -62,30 +55,24 @@
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1\u05d2d|ef</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1|\u05D2def</div>',
   '11-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
   '11-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1\u05d2def|</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2|def</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
   '11-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>abc</span>\u05d0\u05d1|\u05d2def</div>'
-      : '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2d|ef</div>',
+  '<div contenteditable dir="rtl"><span>abc</span>\u05D0\u05D1\u05D2de|f</div>',
   '11-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_ltr.html
index b75e5a0b..8adbe86 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_ltr.html
@@ -3,36 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>|\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>|\u05d0\u05d1\u05d2</span>abc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0|\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
   '12-3 ltr right character');
 
 selection_test(
@@ -62,30 +55,24 @@
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
   '12-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
   '12-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
   '12-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span>\u05d0\u05d1\u05d2</span>abc\u05d3\u05d4|\u05d5</div>'
-      : '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr"><span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5|</div>',
   '12-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_rtl.html
index daf4853..09e66de 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_12_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span>\u05D0\u05D1\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
@@ -32,37 +31,31 @@
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2</span>a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>|abc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2</span>a|bc\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1|\u05D2</span>abc\u05D3\u05D4\u05D5</div>',
   '12-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
   '12-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span>\u05d0\u05d1\u05d2</span>abc|\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2|</span>abc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
   '12-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>abc|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>a|bc\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl"><span>\u05D0\u05D1\u05D2</span>ab|c\u05D3\u05D4\u05D5</div>',
   '12-8 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_13_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_13_ltr.html
index 60ec21d..2dd0b42 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_13_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_13_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5d|ef</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
   '13-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5def</div>',
   '13-5 ltr right character');
 
 selection_test(
@@ -66,23 +61,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d21|23\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
   '13-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123|\u05d3\u05d4\u05d5def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
   '13-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|def</div>',
   '13-11 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_ltr.html
index 17857fe6..9674f38 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2123def</div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123d|ef</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D21|23def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
   '15-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
   '15-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|123def</div>',
   '15-5 ltr right character');
 
 selection_test(
@@ -60,9 +55,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D212|3def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2123|def</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2123def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2123|def</div>',
   '15-8 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_rtl.html
index e4150c7..8feb327c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_15_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05d0\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
   '15-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
   '15-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05d0\u05d1\u05d2123def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
   '15-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2123def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2123def</div>',
   '15-3 rtl right character');
 
 selection_test(
@@ -48,48 +43,42 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d21|23def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2123def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2123def</div>',
   '15-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123def</div>',
   '15-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
   '15-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D212|3def</div>',
   '15-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123|def</div>',
   '15-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1\u05d2123def|</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|123def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123d|ef</div>',
   '15-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0\u05d1|\u05d2123def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D21|23def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2123de|f</div>',
   '15-12 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_ltr.html
index 54c0562..1eea85b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5a|bc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-2 ltr right character');
 
 selection_test(
@@ -48,23 +43,19 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d21|23\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123|\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3|\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-8 ltr right character');
 
 selection_test(
@@ -88,23 +79,19 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc|\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc|\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6|\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
   '16-14 ltr right character');
 
 selection_test(
@@ -128,30 +115,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d84|56\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
   '16-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456|\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
   '16-19 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB|\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9|\u05DB\u05DC</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
   '16-20 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db|\u05dc</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC|</div>',
   '16-21 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_rtl.html
index 167d9c0..243c57b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_16_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
@@ -26,29 +25,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d21|23\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123|\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123|\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D21|23\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D212|3\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-6 rtl right character');
 
 selection_test(
@@ -66,29 +61,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5a|bc\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4|\u05D5abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc|\u05d6\u05d7\u05d8456\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5|abc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc|\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5a|bc\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5ab|c\u05D6\u05D7\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-12 rtl right character');
 
 selection_test(
@@ -106,29 +97,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d84|56\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7|\u05D8456\u05D9\u05DB\u05DC</div>',
   '16-15 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
   '16-16 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2123\u05d3\u05d4\u05d5abc\u05d6\u05d7\u05d8456|\u05d9\u05db\u05dc</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8|456\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
   '16-17 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D8456|\u05D9\u05DB\u05DC</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D84|56\u05D9\u05DB\u05DC</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2123\u05D3\u05D4\u05D5abc\u05D6\u05D7\u05D845|6\u05D9\u05DB\u05DC</div>',
   '16-18 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_ltr.html
index 7b1217d..2c60d4709 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
@@ -50,138 +49,120 @@
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before  |  \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before   | \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    |\u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-15 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-16 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-17 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-19 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-20 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   '17-21 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   '17-22 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   '17-23 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   '17-24 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   '17-25 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   '17-26 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_rtl.html
index b783dcd..58d3a8f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_17_rtl.html
@@ -3,52 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '17-6 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_ltr.html
index ecd04a59..c385f4d2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '18-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   '18-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   '18-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '18-3 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_rtl.html
index 5cb9e0a..43f6a87d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_18_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
@@ -38,150 +37,132 @@
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '18-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9  |  after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '18-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9   | after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '18-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    |after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '18-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   '18-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '18-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   '18-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   '18-12 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   '18-13 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   '18-14 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   '18-15 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   '18-16 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   '18-17 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   '18-18 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   '18-19 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   '18-20 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   '18-21 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   '18-22 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   '18-23 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   '18-24 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   '18-25 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   '18-26 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_ltr.html
index b442a948..4b2775b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
@@ -50,138 +49,120 @@
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before  |  \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before   | \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    |\u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before |   \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0|\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7|\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9| \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8|\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-15 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 |\u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-16 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0|\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-17 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0|\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6|\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-19 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9|\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-20 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7|\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   '19-21 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC|\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   '19-22 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5|\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   '19-23 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4|\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   '19-24 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3|\u05D9\u05D4</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   '19-25 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9|\u05D4</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4|</div>',
   '19-26 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_rtl.html
index ded2aab..535b19c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_19_rtl.html
@@ -3,52 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">be|fore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">bef|ore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">|before    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befo|re    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">before|    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">b|efore    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">befor|e    \u05D0\u05D7\u05E8\u05D9 \u05D0\u05E0\u05E6\u05D9\u05E7\u05DC\u05D5\u05E4\u05D3\u05D9\u05D4</div>',
   '19-6 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_ltr.html
index bdc5128..cf75ef38 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   '20-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>'
-      : '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   '20-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC|\u05E4\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   '20-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0|\u05D9    after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4|\u05E0\u05D9    after encyclopedia</div>',
+  '<div contenteditable dir="ltr" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '20-3 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_rtl.html
index e91c37e..72d6ed68 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_20_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">|\u05DC\u05E4\u05E0\u05D9    after encyclopedia</div>',
@@ -38,150 +37,132 @@
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '20-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9  |  after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '20-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9   | after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '20-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    |after encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>',
   '20-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
   '20-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
   '20-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    af|ter encyclopedia</div>',
   '20-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9 |   after encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    aft|er encyclopedia</div>',
   '20-12 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9|    after encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    afte|r encyclopedia</div>',
   '20-13 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after| encyclopedia</div>',
   '20-14 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
   '20-15 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
   '20-16 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after en|cyclopedia</div>',
   '20-17 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after enc|yclopedia</div>',
   '20-18 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after ency|clopedia</div>',
   '20-19 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyc|lopedia</div>',
   '20-20 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycl|opedia</div>',
   '20-21 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclo|pedia</div>',
   '20-22 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclop|edia</div>',
   '20-23 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclope|dia</div>',
   '20-24 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after |encyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encycloped|ia</div>',
   '20-25 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedia|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    a|fter encyclopedia</div>'
-      : '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after e|ncyclopedia</div>',
+  '<div contenteditable dir="rtl" style="width: 120px;">\u05DC\u05E4\u05E0\u05D9    after encyclopedi|a</div>',
   '20-26 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_ltr.html
index f487061..027144a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
@@ -56,83 +55,73 @@
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-15 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-16 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   '21-17 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   '21-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   '21-19 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_rtl.html
index 70795fa8..db66b81 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_21_rtl.html
@@ -3,59 +3,53 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const isMac = navigator.platform.indexOf('Mac') === 0;
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '21-7 rtl right character');
 
 selection_test(
@@ -139,81 +133,61 @@
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   '21-21 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   '21-22 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   '21-23 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   '21-24 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   '21-25 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   '21-26 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   '21-27 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   '21-28 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>'
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   '21-29 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>'
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   '21-30 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_ltr.html
index 2ed70af6..1c7c008 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
@@ -56,83 +55,73 @@
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is |\u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9|\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5|\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA|\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8| \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 |\u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8| \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6|\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-15 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-16 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 |\u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   '22-17 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE|\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   '22-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA|\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9|\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="ltr" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   '22-19 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_rtl.html
index 7780052a..40649b7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_22_rtl.html
@@ -3,59 +3,53 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const isMac = navigator.platform.indexOf('Mac') === 0;
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Th|is is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">Thi|s is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This| is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">|This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This |is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is| \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">T|his is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This i|s \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes.</div>',
   '22-7 rtl right character');
 
 selection_test(
@@ -139,81 +133,61 @@
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>',
   '22-21 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>',
   '22-22 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
   '22-23 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8| the boxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 th|e boxes.</div>',
   '22-24 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? (usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>'
-      : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>')
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the| boxes.</div>',
   '22-25 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>',
   '22-26 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>',
   '22-27 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the bo|xes.</div>',
   '22-28 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>'
-      : (isMac
-          ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the |boxes.</div>'
-          : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 |the boxes.</div>'),
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the box|es.</div>',
   '22-29 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" contenteditable style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxes|.</div>',
   selection => selection.modify('move', 'right', 'character'),
-  isMac
-  ? '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the b|oxes.</div>'
-  : '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 t|he boxes.</div>',
+  '<div contenteditable dir="rtl" style="width: 100px;">This is \u05D9\u05D5\u05EA\u05E8 \u05E6\u05E8 \u05DE\u05D9\u05EA\u05E8 the boxe|s.</div>',
   '22-30 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_ltr.html
index ba821c9..55a3ae88 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_ltr.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="ltr">|Lorem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_rtl.html
index 1665e0d..993ed92d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_23_rtl.html
@@ -3,243 +3,189 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
   '23-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
   '23-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
   '23-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lo|rem\n        <div></div>\n        ipsum</div>',
   '23-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lor|em\n        <div></div>\n        ipsum</div>',
   '23-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n|        <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n|        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n |       <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n |       <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n  |      <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n  |      <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n   |     <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n   |     <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n    |    <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n    |    <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n     |   <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n     |   <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n      |  <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n      |  <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-12 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n       | <div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n       | <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-13 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        |<div></div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        |<div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">L|orem\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lore|m\n        <div></div>\n        ipsum</div>',
   '23-14 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div>|</div>\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    // The input position is canonicalized into "|ipsum", which causes the
-    // current behavior. It might be changed in the future.
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-15 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>|\n        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-16 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n|        ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-17 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n |       ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-18 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n  |      ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-19 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n   |     ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-20 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n    |    ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-21 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n     |   ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-22 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n      |  ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-23 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n       | ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-24 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>'
-    : '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem|\n        <div></div>\n        ipsum</div>',
   '23-25 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
   '23-26 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
   '23-27 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ip|sum</div>',
   '23-28 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        |ipsum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ips|um</div>',
   '23-29 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsum|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="rtl">|Lorem\n        <div></div>\n        ipsum</div>'
-    : '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        i|psum</div>',
+  '<div contenteditable dir="rtl">Lorem\n        <div></div>\n        ipsu|m</div>',
   '23-30 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_ltr.html
index bf349bb..8c1aa18 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_ltr.html
@@ -3,237 +3,183 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
-
 selection_test(
   '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05E6|\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC|\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA|\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n|        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n |       <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n  |      <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n   |     <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n    |    <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n     |   <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n      |  <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n       | <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        |<div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7|\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   '24-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div>|</div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    // The input position is canonicalized into "|\u05DE\u05E6\u05E0\u05E4\u05EA",
-    // which causes the current behavior. It might be changed in the future.
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div>|</div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>|\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>|\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-15 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n|        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n|        \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-16 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n |       \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n |       \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-17 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n  |      \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n  |      \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-18 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n   |     \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n   |     \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-19 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n    |    \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n    |    \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-20 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n     |   \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n     |   \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-21 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n      |  \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n      |  \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-22 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n       | \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n       | \u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-23 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   '24-24 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        |\u05DE\u05E6\u05E0\u05E4\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
   '24-25 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE|\u05E6\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
   '24-26 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6|\u05E0\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
   '24-27 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0|\u05E4\u05EA</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
   '24-28 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-    ? '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4|\u05EA</div>'
-    : '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
+  '<div contenteditable dir="ltr">\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA|</div>',
   '24-29 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_rtl.html
index 6d10761..d36338d2f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_24_rtl.html
@@ -3,6 +3,7 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
+
 selection_test(
   '<div contenteditable dir="rtl">|\u05E6\u05DC\u05D7\u05EA\n        <div></div>\n        \u05DE\u05E6\u05E0\u05E4\u05EA</div>',
   selection => selection.modify('move', 'right', 'character'),
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_ltr.html
index bd7940c9..4a6133de 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
@@ -44,54 +43,48 @@
 selection_test(
   '<div contenteditable dir="ltr">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcdef|\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcdef|\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0|\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
   '25-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1|\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
   '25-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2|<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
   '25-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>|\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
   '25-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
   '25-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abcdef\u05d0\u05d1\u05d2<img>\u05d3\u05d4|\u05d5</div>'
-      : '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5|</div>',
   '25-13 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_rtl.html
index 49f47e93..809db33 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_25_rtl.html
@@ -3,52 +3,47 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bcdef\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">ab|cdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abc|def\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abcdef|\u05d0\u05d1\u05d2<img>\u05d3\u05d4\u05d5</div>'
-      : '<div contenteditable dir="rtl">|abcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abcd|ef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abcdef|\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bcdef\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">abcde|f\u05D0\u05D1\u05D2<img>\u05D3\u05D4\u05D5</div>',
   '25-6 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_ltr.html
index 63be6d4..99e4b1d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_ltr.html
@@ -3,46 +3,41 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5a|bc<img>def</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5abc<img>def</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
   '26-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
   '26-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|\u05D3\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
   '26-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3|\u05D4\u05D5abc<img>def</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
   '26-5 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_rtl.html
index 8f1732f..3f0398e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_26_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def</div>',
@@ -44,54 +43,48 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5a|bc<img>def</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4|\u05D5abc<img>def</div>',
   '26-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
   '26-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
   '26-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5ab|c<img>def</div>',
   '26-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc|<img>def</div>',
   '26-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>|def</div>',
   '26-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5abc<img>def|</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5|abc<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>d|ef</div>',
   '26-12 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2\u05d3\u05d4|\u05d5abc<img>def</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5a|bc<img>def</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5abc<img>de|f</div>',
   '26-13 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_ltr.html
index 6e21005..8a0a66c3 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
@@ -32,53 +31,49 @@
 selection_test(
   '<div contenteditable dir="ltr">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>'
-      : '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<input>|\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0|\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1|\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
   '27-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2|<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
   '27-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img>|<img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
   '27-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>|\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
   '27-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3|\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="ltr">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
   '27-11 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_rtl.html
index ecada0b..49467662 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_27_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>'
-      : '<div contenteditable dir="rtl">|abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">ab|c<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi</div>',
   '27-3 rtl right character');
 
 selection_test(
@@ -84,30 +79,24 @@
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>',
   '27-12 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
   '27-13 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5|ghi</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
   '27-14 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5ghi|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4|\u05D5ghi</div>'
-      : '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5g|hi</div>',
+  '<div contenteditable dir="rtl">abc<input>\u05D0\u05D1\u05D2<img><img>\u05D3\u05D4\u05D5gh|i</div>',
   '27-15 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_ltr.html
index 6c7d611..f8d7f6d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-2 ltr right character');
 
 selection_test(
@@ -84,30 +79,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
   '28-12 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
   '28-13 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
   '28-14 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4|\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5|</div>',
   '28-15 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_rtl.html
index ba04228..0648261 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_28_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
@@ -32,59 +31,55 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<input>abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>ab|c<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc|<img><img>def\u05D3\u05D4\u05D5</div>',
   '28-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img>|<img>def\u05D3\u05D4\u05D5</div>',
   '28-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>|def\u05D3\u05D4\u05D5</div>',
   '28-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>|abc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>d|ef\u05D3\u05D4\u05D5</div>',
   '28-11 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>def|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>a|bc<img><img>def\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<input>abc<img><img>de|f\u05D3\u05D4\u05D5</div>',
   '28-12 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_ltr.html
index 2733815c..71009e7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
@@ -26,62 +25,54 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
   '29-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
   '29-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
   '29-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
   '29-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
   '29-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2<span>\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5|</span></div>',
   '29-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2<span>\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span>|</div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span>|</div>',
   '29-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_rtl.html
index 186577b..6dd3bf0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_29_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05d0\u05d1\u05d2<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>\u05D3\u05D4\u05D5</span></div>',
   '29-3 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_ltr.html
index 6b47898..539c2a2a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a|bc<span>def</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
   '30-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2abc<span>def</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
   '30-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
   '30-2 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_rtl.html
index ebb4828..6beadf6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_30_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc<span>def</span></div>',
@@ -26,62 +25,54 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a|bc<span>def</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc<span>def</span></div>',
   '30-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
   '30-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
   '30-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
   '30-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>def</span></div>',
   '30-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>def</span></div>',
   '30-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2abc<span>def|</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>d|ef</span></div>',
   '30-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1|\u05d2abc<span>def</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
   '30-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1|\u05d2abc<span>def</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>def</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>de|f</span></div>',
   '30-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_ltr.html
index 15cbf6d8..d9e78b2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
@@ -32,23 +31,19 @@
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab<span>c\u05d0\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
   '31-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">ab<span>c|\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
   '31-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">ab<span>c\u05D0|\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
   '31-6 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_rtl.html
index 1316316..b58c0ff 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_31_rtl.html
@@ -3,42 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|b<span>c\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c|\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>|c\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c|\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|ab<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|b<span>c\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|<span>c\u05D0\u05D1\u05D2def</span></div>',
   '31-4 rtl right character');
 
 selection_test(
@@ -56,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1|\u05D2def</span></div>',
   '31-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
   '31-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1\u05d2def|</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
   '31-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
   '31-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">ab<span>c\u05d0\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">ab<span>c\u05D0\u05D1\u05D2de|f</span></div>',
   '31-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_ltr.html
index f2133ff..d864bd31 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_ltr.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2a|bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1<span>\u05d2abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   '32-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>|\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   '32-3 ltr right character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
   '32-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
   '32-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
   '32-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5|</span></div>',
   '32-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1<span>\u05d2abc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span>|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span>|</div>',
   '32-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_rtl.html
index 44ed480..8eecffc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_32_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
@@ -32,29 +31,25 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1<span>\u05d2a|bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|<span>\u05D2abc\u05D3\u05D4\u05D5</span></div>',
   '32-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
   '32-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1<span>\u05d2abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2|abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
   '32-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2a|bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1<span>\u05D2ab|c\u05D3\u05D4\u05D5</span></div>',
   '32-7 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_ltr.html
index 157c390..c868d7a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
@@ -26,31 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<span>\u05d0\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
   '33-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc<span>\u05d0\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
   '33-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|<span>\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
   '33-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc<span>\u05D0|\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
   '33-6 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_rtl.html
index 0e8d3bd..88f15646 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_33_rtl.html
@@ -3,40 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc<span>\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|<span>\u05d0\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|abc<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|<span>\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>|\u05D0\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc<span>\u05D0\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|c<span>\u05D0\u05D1\u05D2def</span></div>',
   '33-4 rtl right character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1|\u05D2def</span></div>',
   '33-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
   '33-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1\u05d2def|</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
   '33-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
   '33-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc<span>\u05d0\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc<span>\u05D0\u05D1\u05D2de|f</span></div>',
   '33-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_ltr.html
index d71e013..327d721 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>a|bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2<span>abc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-2 ltr right character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
   '34-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
   '34-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
   '34-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5|</span></div>',
   '34-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2<span>abc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span>|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span>|</div>',
   '34-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_rtl.html
index c70b477..24485f4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_34_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
@@ -26,37 +25,31 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2<span>a|bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>|abc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2<span>a|bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
   '34-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2<span>abc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|<span>abc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
   '34-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>abc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>a|bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2<span>ab|c\u05D3\u05D4\u05D5</span></div>',
   '34-7 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_ltr.html
index ae73a45..cc53db8 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0def</div>',
@@ -26,9 +25,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05D0d|ef</div>'
-      : '<div contenteditable dir="ltr">abc\u05D0|def</div>',
+  '<div contenteditable dir="ltr">abc\u05D0|def</div>',
   '35-3 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_rtl.html
index dde1002..a610c329f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_35_rtl.html
@@ -3,63 +3,52 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05D0def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0def</div>',
   '35-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
+  '<div contenteditable dir="rtl">|abc\u05D0def</div>',
   '35-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05D0def</div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0def</div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
   '35-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0def</div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0def</div>',
   '35-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0d|ef</div>'
-      : '<div contenteditable dir="rtl">abc|\u05D0def</div>',
+  '<div contenteditable dir="rtl">abc|\u05D0def</div>',
   '35-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
+  '<div contenteditable dir="rtl">abc\u05D0|def</div>',
   '35-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0def|</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0|def</div>',
+  '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
   '35-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05D0def</div>'
-      : '<div contenteditable dir="rtl">abc\u05D0d|ef</div>',
+  '<div contenteditable dir="rtl">abc\u05D0de|f</div>',
   '35-7 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_ltr.html
index c50c1f4..8f6cafa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   '36-2 ltr right character');
 
 selection_test(
@@ -36,30 +31,24 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
   '36-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
   '36-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
   '36-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4|\u05D5</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5|</div>',
   '36-7 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_rtl.html
index 9d2b8f1..b0d6842c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_36_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2a\u05D3\u05D4\u05D5</div>',
@@ -26,17 +25,13 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2a\u05D3\u05D4\u05D5</div>',
   '36-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a\u05D3\u05D4\u05D5</div>',
   '36-4 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_ltr.html
index 5979377..a3a2f1e5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
@@ -26,23 +25,19 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0\u05d1\u05d2<span>d|ef</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
   '37-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0\u05d1\u05d2<span>def</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   '37-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
   '37-5 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_rtl.html
index 49cd57e..390b0b20 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_37_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0\u05D1\u05D2<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0\u05D1\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0\u05D1\u05D2<span>def</span></div>',
   '37-3 rtl right character');
 
 selection_test(
@@ -48,46 +43,36 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   '37-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>',
   '37-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
   '37-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2|<span>def</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
   '37-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
   '37-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05D0\u05D1|\u05D2<span>def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0\u05D1\u05D2<span>de|f</span></div>',
   '37-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_ltr.html
index 902a38f..1e8be025 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a|bc<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2abc<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-2 ltr right character');
 
 selection_test(
@@ -48,46 +43,36 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc|<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
   '38-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
   '38-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc|<span>\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
   '38-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
   '38-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5|</span></div>',
   '38-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2abc<span>\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span>|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span>|</div>',
   '38-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_rtl.html
index 48a0d29a..0711acbe 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_38_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
@@ -26,35 +25,31 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|abc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
   '38-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc|<span>\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   '38-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2abc<span>|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|bc<span>\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2ab|c<span>\u05D3\u05D4\u05D5</span></div>',
   '38-7 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_ltr.html
index face355f..5353f32 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
@@ -26,31 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc\u05d0<span>\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
   '39-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   '39-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0<span>|\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">abc|\u05d0<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   '39-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">abc\u05D0|<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="ltr">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
   '39-6 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_rtl.html
index 0170d4f..6569f23be 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_39_rtl.html
@@ -3,34 +3,29 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">a|bc\u05d0<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc|\u05d0<span>\u05d1\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">|abc\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc|\u05D0<span>\u05D1\u05D2def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">a|bc\u05D0<span>\u05D1\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">ab|c\u05D0<span>\u05D1\u05D2def</span></div>',
   '39-3 rtl right character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2d|ef</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1|\u05D2def</span></div>',
   '39-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
   '39-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1\u05d2def|</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2|def</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
   '39-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
   '39-10 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">abc\u05d0<span>\u05d1|\u05d2def</span></div>'
-      : '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2d|ef</span></div>',
+  '<div contenteditable dir="rtl">abc\u05D0<span>\u05D1\u05D2de|f</span></div>',
   '39-11 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_ltr.html
index 5dcd3968..43c0121 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_ltr.html
@@ -3,28 +3,23 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a|<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">|\u05d0\u05d1\u05d2a<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0|\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-2 ltr right character');
 
 selection_test(
@@ -54,38 +49,30 @@
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
   '40-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
   '40-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4|\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3|\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
   '40-9 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5|</span></div>',
   '40-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr">\u05d0\u05d1\u05d2a<span>bc\u05d3\u05d4|\u05d5</span></div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span>|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span>|</div>',
   '40-11 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_rtl.html
index 639edfb..806cfe41 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_40_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|\u05D0\u05D1\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
@@ -26,35 +25,31 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a|<span>bc\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1|\u05D2a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>|bc\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl">\u05d0\u05d1\u05d2a<span>bc|\u05d3\u05d4\u05d5</span></div>'
-      : '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2|a<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
   '40-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>bc|\u05D3\u05D4\u05D5</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a|<span>bc\u05D3\u05D4\u05D5</span></div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D2a<span>b|c\u05D3\u05D4\u05D5</span></div>',
   '40-7 rtl right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_ltr.html
index 11be489..f2f3a93 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_ltr.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">|abc<!-- -->\n<!-- -->def</div>',
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_rtl.html
index d13a0c8..269f1ad 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_41_rtl.html
@@ -3,77 +3,64 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">|abc<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">|abc \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">|abc \n def</div>',
   '41-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">a|bc<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">ab|c \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">|abc \n def</div>',
   '41-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">ab|c<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">|abc \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>',
   '41-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc|<!-- -->\n<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">ab|c \n def</div>',
   '41-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->|\n<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">a|bc \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">ab|c \n def</div>',
   '41-4 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n|<!-- -->def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
   '41-5 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->|def</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>',
   '41-6 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->d|ef</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
   '41-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->de|f</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc \n def|</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n |def</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>',
   '41-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">abc<!-- -->\n<!-- -->def|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl" style="white-space: pre;">abc| \n def</div>'
-      : '<div contenteditable dir="rtl" style="white-space: pre;">abc \n d|ef</div>',
+  '<div contenteditable dir="rtl" style="white-space: pre;">abc \n de|f</div>',
   '41-9 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_ltr.html
index b9aa4dbd..8840ece 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_ltr.html
@@ -3,81 +3,64 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">|\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2 \n \u05D3\u05D4\u05D5</div>',
   '42-1 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1|\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0|\u05D1\u05D2 \n \u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2| \n \u05D3\u05D4\u05D5</div>',
   '42-2 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2|<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
   '42-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->|\n<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>',
   '42-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n|<!-- -->\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n| \u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>',
   '42-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->|\u05D3\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>',
   '42-6 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3|\u05D4\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n |\u05D3\u05D4\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>',
   '42-7 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4|\u05D5</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3|\u05D4\u05D5</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>',
   '42-8 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4|\u05D5</div>'
-      : '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>',
+  '<div contenteditable dir="ltr" style="white-space: pre;">\u05D0\u05D1\u05D2 \n \u05D3\u05D4\u05D5|</div>',
   '42-9 ltr right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_rtl.html
index cd09342..b5ee48d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_42_rtl.html
@@ -3,7 +3,6 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space: pre;">|\u05D0\u05D1\u05D2<!-- -->\n<!-- -->\u05D3\u05D4\u05D5</div>',
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_ltr.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_ltr.html
index 46d056a..8368541 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_ltr.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_ltr.html
@@ -3,22 +3,17 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="ltr">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-0 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-1 ltr right character');
 
 selection_test(
@@ -30,31 +25,25 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-3 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-4 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-5 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7|\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
   '43-6 ltr right character');
 
 selection_test(
@@ -78,23 +67,19 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
   '43-10 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
   '43-11 ltr right character');
 
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0|\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   '43-12 ltr right character');
 
 selection_test(
@@ -112,9 +97,7 @@
 selection_test(
   '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>'
-      : '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
+  '<div contenteditable dir="ltr"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
   '43-15 ltr right character');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_rtl.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_rtl.html
index a811317..6cdbf59 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_rtl.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_character_43_rtl.html
@@ -3,42 +3,35 @@
 <script src="../../../resources/testharnessreport.js"></script>
 <script src="../../assert_selection.js"></script>
 <script>
-const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
 
 selection_test(
   '<div contenteditable dir="rtl">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl">|<span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-0 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-1 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-2 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">|abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-3 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc|\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">a|bc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">ab|c\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-4 rtl right character');
 
 selection_test(
@@ -56,29 +49,25 @@
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7|\u05E7123\u05E0\u05E0\u05E0def</span></div>',
   '43-7 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
   '43-8 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7|123\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
   '43-9 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123|\u05E0\u05E0\u05E0def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E71|23\u05E0\u05E0\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E712|3\u05E0\u05E0\u05E0def</span></div>',
   '43-10 rtl right character');
 
 selection_test(
@@ -96,34 +85,30 @@
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0|\u05E0def</span></div>',
   '43-13 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
   '43-14 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  usesBidiAffinity
-      ? '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>'
-      : '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0|def</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
   '43-15 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def|</span></div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   '43-16 rtl right character');
 
 selection_test(
   '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0def</span>|</div>',
   selection => selection.modify('move', 'right', 'character'),
-  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0d|ef</span></div>',
+  '<div contenteditable dir="rtl"><span dir="rtl">abc\u05E7\u05E7\u05E7123\u05E0\u05E0\u05E0de|f</span></div>',
   '43-17 rtl right character');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_ltr_multi_line.html
index c86e772..70018c7e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc |def<br><br><br>uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>',
   '1-3 ltr right word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>',
   '1-4 ltr right word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>',
   '1-5 ltr right word');
 
 selection_test(
@@ -61,7 +61,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<br><br><br>uvw xyz</div>',
   '1-6 ltr right word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def<br><br><br>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def<br><br><br>uvw |xyz</div>',
   '1-7 ltr right word');
 
 selection_test(
@@ -77,7 +77,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def<br><br><br>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def<br><br><br>uvw |xyz</div>',
   '1-8 ltr right word');
 
 selection_test(
@@ -85,7 +85,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def<br><br><br>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def<br><br><br>uvw |xyz</div>',
   '1-9 ltr right word');
 
 selection_test(
@@ -117,7 +117,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def<br><br><br>uvw xyz|</div>'
-      : '<div contenteditable dir="ltr">abc def<br><br><br>uvw |xyz</div>',
+      : '<div contenteditable dir="ltr">abc def<br><br><br>uvw xyz|</div>',
   '1-13 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_rtl_multi_line.html
index 0d2397d..1fa0d0d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_01_rtl_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def<br><br><br>uvw xyz</div>',
   '1-1 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def<br><br><br>uvw xyz</div>',
   '1-2 rtl right word');
 
 selection_test(
@@ -41,49 +41,49 @@
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-5 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-6 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|<br><br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-7 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br>|<br><br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-8 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br>|<br>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-9 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<br><br><br>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<br><br><br>uvw xyz</div>',
   '1-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>u|vw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
   '1-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uv|w xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
   '1-12 rtl right word');
 
 selection_test(
@@ -101,18 +101,18 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uvw x|yz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-15 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uvw xy|z</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>|uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-16 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<br><br><br>uvw xyz|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<br><br><br>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<br><br><br>uvw |xyz</div>',
   '1-17 rtl right word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_ltr_multi_line.html
index bf86a658..2a049f1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-3 ltr right word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-4 ltr right word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-5 ltr right word');
 
 selection_test(
@@ -61,79 +61,79 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      : '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-6 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-7 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-8 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br>|</div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-9 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div>|<div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-10 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-11 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br>|</div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-12 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div>|<div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-13 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-14 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br>|</div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+      ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>'
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-15 ltr right word');
 
 selection_test(
@@ -165,7 +165,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>'
-      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
+      : '<div contenteditable dir="ltr">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
   '2-19 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_rtl_multi_line.html
index 34d1872..bad21c61 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_02_rtl_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-1 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-2 rtl right word');
 
 selection_test(
@@ -41,85 +41,85 @@
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-5 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-6 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-7 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-8 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br>|</div><div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-9 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div>|<div><br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br>|</div><div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div>|<br></div><div><br></div><div><br></div>uvw xyz</div>',
   '2-12 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div>|<div><br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-13 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-14 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br>|</div>uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div>|<br></div><div><br></div>uvw xyz</div>',
   '2-15 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def<div><br></div><div><br></div><div><br></div>uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div>|<br></div>uvw xyz</div>',
   '2-16 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>u|vw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
   '2-17 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uv|w xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
   '2-18 rtl right word');
 
 selection_test(
@@ -137,18 +137,18 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw x|yz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-21 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xy|z</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>|uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-22 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw xyz|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def<div><br></div><div><br></div><div><br></div>uvw |xyz</div>',
   '2-23 rtl right word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_03_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_03_ltr_multi_line.html
index f2999cc..b36d1a1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_03_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_03_ltr_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-0 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-1 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-2 ltr right word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-3 ltr right word');
 
 selection_test(
@@ -45,67 +45,71 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-4 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-5 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '3-6 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-7 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br>|<br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-8 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br>|<br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-9 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-10 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-11 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '3-12 ltr right word');
 
 selection_test(
@@ -119,23 +123,23 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '3-14 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '3-15 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<br><br><br>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '3-16 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_ltr_multi_line.html
index eee71a0d..67d98b740 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_ltr_multi_line.html
@@ -12,24 +12,24 @@
   '<div contenteditable dir="ltr">|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-0 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-1 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-2 ltr right word');
 
 selection_test(
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-3 ltr right word');
 
 selection_test(
@@ -45,115 +45,119 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-4 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-5 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-6 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-7 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-8 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-9 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-10 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-11 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-12 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-13 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-14 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-15 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-16 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-17 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '4-18 ltr right word');
 
 selection_test(
@@ -167,23 +171,23 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '4-20 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '4-21 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '4-22 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_rtl_multi_line.html
index 4170971f..9f3ca51b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_04_rtl_multi_line.html
@@ -71,43 +71,43 @@
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-12 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-13 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-14 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-15 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0<div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '4-16 rtl right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_05_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_05_ltr_multi_line.html
index 074271a..dbd34bd 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_05_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_05_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0| hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc |\u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-3 ltr right word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij| \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-7 ltr right word');
 
 selection_test(
@@ -101,7 +101,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-11 ltr right word');
 
 selection_test(
@@ -133,7 +133,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-15 ltr right word');
 
 selection_test(
@@ -141,7 +141,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-16 ltr right word');
 
 selection_test(
@@ -149,7 +149,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-17 ltr right word');
 
 selection_test(
@@ -157,7 +157,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz| <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz |<br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-18 ltr right word');
 
 selection_test(
@@ -165,7 +165,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-19 ltr right word');
 
 selection_test(
@@ -173,7 +173,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-20 ltr right word');
 
 selection_test(
@@ -181,7 +181,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-21 ltr right word');
 
 selection_test(
@@ -189,7 +189,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-22 ltr right word');
 
 selection_test(
@@ -221,7 +221,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj| \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
   '5-26 ltr right word');
 
 selection_test(
@@ -245,7 +245,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0| opq \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |opq \u05D0\u05D0\u05D0</div>',
   '5-29 ltr right word');
 
 selection_test(
@@ -277,7 +277,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq| \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |opq \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq |\u05D0\u05D0\u05D0</div>',
   '5-33 ltr right word');
 
 selection_test(
@@ -309,7 +309,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq |\u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 xyz <br><br><br>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 opq \u05D0\u05D0\u05D0|</div>',
   '5-37 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_ltr_multi_line.html
index ed61b09..a4c7a12 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0| hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc |\u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-3 ltr right word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 |hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-7 ltr right word');
 
 selection_test(
@@ -100,32 +100,32 @@
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-11 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-12 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-13 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-14 ltr right word');
 
 selection_test(
@@ -141,23 +141,23 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-16 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-17 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0| uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-18 ltr right word');
 
 selection_test(
@@ -165,7 +165,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-19 ltr right word');
 
 selection_test(
@@ -197,7 +197,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-23 ltr right word');
 
 selection_test(
@@ -205,7 +205,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-24 ltr right word');
 
 selection_test(
@@ -213,7 +213,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-25 ltr right word');
 
 selection_test(
@@ -221,87 +221,87 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-26 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-27 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz |<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-28 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-29 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-30 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-31 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-32 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-33 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-34 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-35 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0| kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-36 ltr right word');
 
 selection_test(
@@ -333,7 +333,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj| \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 |kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-40 ltr right word');
 
 selection_test(
@@ -357,7 +357,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0| mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj |\u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-43 ltr right word');
 
 selection_test(
@@ -389,7 +389,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-47 ltr right word');
 
 selection_test(
@@ -413,7 +413,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-50 ltr right word');
 
 selection_test(
@@ -444,28 +444,32 @@
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-54 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-55 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0|\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-56 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0|\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
+  isMac
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>',
   '6-57 ltr right word');
 
 selection_test(
@@ -479,23 +483,23 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '6-59 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0|\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '6-60 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0|\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 |\u05D0\u05D0\u05D0</div>'
-      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0| \u05D0\u05D0\u05D0</div>',
+      ? '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>'
+      : '<div contenteditable dir="ltr">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0|</div>',
   '6-61 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_rtl_multi_line.html
index e9aae06..7785683 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_06_rtl_multi_line.html
@@ -137,13 +137,13 @@
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 u|vw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-21 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uv|w xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-22 rtl right word');
 
 selection_test(
@@ -161,79 +161,79 @@
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw x|yz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-25 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xy|z <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 |uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-26 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz| <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-27 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz |<div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-28 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-29 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br>|</div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw |xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-30 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div>|<div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-31 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-32 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br>|</div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div>|<br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-33 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div>|<div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-34 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-35 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br>|</div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div>|<br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-36 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>|\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw| xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div>|<br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-37 rtl right word');
 
 selection_test(
@@ -305,7 +305,7 @@
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 m|n opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-49 rtl right word');
 
 selection_test(
@@ -323,25 +323,25 @@
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn o|pq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-52 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn op|q \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 |mn opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-53 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq| \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-54 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn opq |\u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn| opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
+  '<div contenteditable dir="rtl">abc \u05D0\u05D0\u05D0 hij \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0 uvw xyz <div><br></div><div><br></div><div><br></div>\u05D0\u05D0\u05D0 kj \u05D0\u05D0\u05D0 mn |opq \u05D0\u05D0\u05D0 \u05D0\u05D0\u05D0</div>',
   '6-55 rtl right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_ltr_multi_line.html
index 0e73702..b47de61 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="ltr">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-3 ltr right word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-4 ltr right word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-5 ltr right word');
 
 selection_test(
@@ -61,7 +61,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   '7-6 ltr right word');
 
 selection_test(
@@ -69,7 +69,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>opq| xyz</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-7 ltr right word');
 
 selection_test(
@@ -141,7 +141,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>opq xyz|</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
+      : '<div contenteditable dir="ltr">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
   '7-16 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_rtl_multi_line.html
index 8f66c43..3a3ee88 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_07_rtl_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-1 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-2 rtl right word');
 
 selection_test(
@@ -41,67 +41,67 @@
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-5 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-6 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-7 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div>|</div><div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-8 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div>|<div></div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-9 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div>|</div><div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div>|<div></div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div>|</div>opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-12 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div>opq xyz</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div>opq xyz</div>',
   '7-13 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>o|pq xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
   '7-14 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>op|q xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
   '7-15 rtl right word');
 
 selection_test(
@@ -119,18 +119,18 @@
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq x|yz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-18 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xy|z</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|opq xyz</div>',
+  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-19 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq xyz|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq| xyz</div>',
+  '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>opq |xyz</div>',
   '7-20 rtl right word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_ltr_multi_line.html
index 73ef884..5169d2a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div></div>'
-      : '<div contenteditable dir="ltr">abc |ghi<div></div><div></div><div></div></div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div></div><div></div><div></div></div>',
   '8-3 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_rtl_multi_line.html
index 4384fd2..e3256ff1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_08_rtl_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div></div>',
   '8-1 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div></div>',
   '8-2 rtl right word');
 
 selection_test(
@@ -41,54 +41,54 @@
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-5 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-6 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi|<div></div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-7 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div>|</div><div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-8 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div>|<div></div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-9 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div>|</div><div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div>|<div></div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div>|</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-12 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div></div><div></div><div></div>|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div></div><div></div><div></div></div>',
+  '<div contenteditable dir="rtl">abc |ghi<div></div><div></div><div></div></div>',
   '8-13 rtl right word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_ltr_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_ltr_multi_line.html
index 1cca6fa..e19e2e8 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_ltr_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_ltr_multi_line.html
@@ -37,7 +37,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="ltr">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-3 ltr right word');
 
 selection_test(
@@ -45,7 +45,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-4 ltr right word');
 
 selection_test(
@@ -53,7 +53,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-5 ltr right word');
 
 selection_test(
@@ -61,23 +61,23 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi|<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-6 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi|<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>',
   '9-7 ltr right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc ghi<div>|<img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
   isMac
-      ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>'
+      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png">|</div><div></div><div></div>opq rst</div>',
   '9-8 ltr right word');
 
 selection_test(
@@ -85,7 +85,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-9 ltr right word');
 
 selection_test(
@@ -149,7 +149,7 @@
   selection => selection.modify('move', 'right', 'word'),
   isMac
       ? '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>'
-      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
+      : '<div contenteditable dir="ltr">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst|</div>',
   '9-17 ltr right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_rtl_multi_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_rtl_multi_line.html
index 641c45e..3fbf8bc0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_rtl_multi_line.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_09_rtl_multi_line.html
@@ -17,13 +17,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">|abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-1 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">|abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-2 rtl right word');
 
 selection_test(
@@ -41,73 +41,73 @@
 selection_test(
   '<div contenteditable dir="rtl">abc g|hi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-5 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc gh|i<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-6 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi|<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-7 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div>|<img src=../../resources/abe.png></div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc |ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-8 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png>|</div><div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-9 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div>|<div></div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-10 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div>|</div><div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-11 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div>|<div></div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-12 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div>|</div>opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-13 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>|opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div>|<img src="../../resources/abe.png"></div><div></div><div></div>opq rst</div>',
   '9-14 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>o|pq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
   '9-15 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>op|q rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
   '9-16 rtl right word');
 
 selection_test(
@@ -125,18 +125,18 @@
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq r|st</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-19 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rs|t</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>|opq rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-20 rtl right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc ghi<div><img src=../../resources/abe.png></div><div></div><div></div>opq rst|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq| rst</div>',
+  '<div contenteditable dir="rtl">abc ghi<div><img src="../../resources/abe.png"></div><div></div><div></div>opq |rst</div>',
   '9-21 rtl right word');
 </script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_inline_block_positioned_element_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_inline_block_positioned_element_1.html
index c25283e..928915b8 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_inline_block_positioned_element_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_inline_block_positioned_element_1.html
@@ -39,43 +39,43 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin| start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin |start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-5 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin |start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-6 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin s|tart</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-7 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin st|art</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-8 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin sta|rt</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-9 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin star|t</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-10 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start|</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">|abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc |def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-11 right word');
 
 selection_test(
@@ -99,31 +99,31 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc| def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc |def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def|</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-15 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc |def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>|end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def|</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-16 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc d|ef</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>|end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def|</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-17 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc de|f</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>|end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def|</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-18 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def|</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>|end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end |ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-19 right word');
 
 selection_test(
@@ -147,31 +147,31 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end| ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end |ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing|</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-23 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end |ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">|this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing|</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-24 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end i|ng</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">|this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing|</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-25 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end in|g</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">|this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing|</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-26 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing|</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">|this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this |is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-27 right word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this| is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this |is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is |float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-32 right word');
 
 selection_test(
@@ -219,43 +219,43 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is| float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is |float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-35 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is |float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-36 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is f|loat</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-37 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is fl|oat</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-38 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is flo|at</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-39 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is floa|t</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-40 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float|</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">|this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this |is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-41 right word');
 
 selection_test(
@@ -285,7 +285,7 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this| is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this |is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is |fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-46 right word');
 
 selection_test(
@@ -303,43 +303,43 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is| fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is |fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-49 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is |fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-50 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is f|ixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-51 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fi|xed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-52 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fix|ed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-53 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixe|d</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-54 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed|</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">|this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this |is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-55 right word');
 
 selection_test(
@@ -369,7 +369,7 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this| is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this |is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is |relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-60 right word');
 
 selection_test(
@@ -387,61 +387,61 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is| relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is |relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-63 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is |relative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-64 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is r|elative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-65 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is re|lative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-66 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is rel|ative</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-67 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is rela|tive</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-68 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relat|ive</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-69 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relati|ve</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-70 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relativ|e</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   '1-71 right word');
 
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative|</div><div style="position:absolute; left:100px; top:150px">this is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">|this is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this |is absolute</div></div>',
   '1-72 right word');
 
 selection_test(
@@ -471,7 +471,7 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this| is absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this |is absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is |absolute</div></div>',
   '1-77 right word');
 
 selection_test(
@@ -489,7 +489,7 @@
 selection_test(
   '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is| absolute</div></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is |absolute</div></div>',
+  '<div contenteditable style="width:2000px; height:2000px"><div>begin start</div><div style="display:inline-block">abc def</div><div>end ing</div><div style="float:left">this is float</div><div style="position:fixed; top:30px; right:5px">this is fixed</div><div style="position:relative; left:20px">this is relative</div><div style="position:absolute; left:100px; top:150px">this is absolute|</div></div>',
   '1-80 right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_1.html
index 32b78b9..70f657e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_1.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def    hij opq</div>',
+  '<div contenteditable dir="ltr">abc def |   hij opq</div>',
   '1-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def|    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |   hij opq</div>',
+  '<div contenteditable dir="ltr">abc def    hij |opq</div>',
   '1-7 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def    hij| opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def    hij |opq</div>',
+  '<div contenteditable dir="ltr">abc def    hij opq|</div>',
   '1-14 right word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr">abc def    hij opq|</div>',
   '1-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_10.html
index c95db06..04fba65 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_10.html
@@ -9,109 +9,109 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|צ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ |דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ ד|עפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דע|פ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '10-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ |   היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ  |  היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ   | היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    |היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    ה|יח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    הי|ח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '10-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '10-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח |ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '10-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח ו|פק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '10-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ    היח ופ|ק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '10-17 right word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr">אבצ דעפ    היח ופק|</div>',
   '10-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_11.html
index 0144d82..ade9574 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_11.html
@@ -9,73 +9,73 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח |   abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|צ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח |   abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '11-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח |   abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ |דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ ד|עפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דע|פ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '11-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   abc def hij</div>',
   '11-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ |היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   abc def hij</div>',
   '11-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ ה|יח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   abc def hij</div>',
   '11-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ הי|ח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   abc def hij</div>',
   '11-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח|    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח |   abc def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc |def hij</div>',
   '11-11 right word');
 
 selection_test(
@@ -117,7 +117,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח    abc| def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח    abc |def hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def |hij</div>',
   '11-18 right word');
 
 selection_test(
@@ -141,7 +141,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבצ דעפ היח    abc def| hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבצ דעפ היח    abc def |hij</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij|</div>',
   '11-22 right word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr">אבצ דעפ היח    abc def hij|</div>',
   '11-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_12.html
index 6b811a0..d408151 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_12.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def hij    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def hij    אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def |hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| hij    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |hij    אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij |   \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-7 right word');
 
 selection_test(
@@ -75,97 +75,97 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij|    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij  |  אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij   | אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    א|בצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אב|צ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ |דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ ד|עפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דע|פ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '12-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   opq rst uvw</div>',
   '12-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ |היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   opq rst uvw</div>',
   '12-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ ה|יח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   opq rst uvw</div>',
   '12-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ הי|ח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7 |   opq rst uvw</div>',
   '12-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח|    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq |rst uvw</div>',
   '12-26 right word');
 
 selection_test(
@@ -207,7 +207,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq |rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst |uvw</div>',
   '12-33 right word');
 
 selection_test(
@@ -231,7 +231,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq rst |uvw</div>',
+  '<div contenteditable dir="ltr">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw|</div>',
   '12-37 right word');
 
 selection_test(
@@ -258,4 +258,3 @@
   '<div contenteditable dir="ltr">abc def hij    אבצ דעפ היח    opq rst uvw|</div>',
   '12-41 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_13.html
index 2b8584a9..7827069 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_13.html
@@ -15,109 +15,108 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
   '13-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
   '13-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
   '13-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
   '13-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def|    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def  |  hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def   | hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    |hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc |def    hij opq</div>',
   '13-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    h|ij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hi|j opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij| opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def |   hij opq</div>',
   '13-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij o|pq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij op|q</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def    hij opq|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl">abc def    hij |opq</div>',
   '13-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_14.html
index 425b7cc..672003c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_14.html
@@ -39,169 +39,168 @@
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc  |  def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc   | def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    |def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
   '14-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def  |  hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def   | hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    |hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    opq    </div>',
   '14-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    h|ij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hi|j    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij  |  opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij   | opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    |opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    opq    </div>',
   '14-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    o|pq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    op|q    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    opq|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    opq |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    opq  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    opq   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    opq    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij |   opq    </div>',
   '14-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_15.html
index e01af0aa..8d2caf46 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_15.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl">    abc    אבצ |   def    </div>',
   '15-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_16.html
index 9f4d0d8..378c0b7d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_16.html
@@ -39,13 +39,13 @@
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-6 right word');
 
 selection_test(
@@ -81,43 +81,43 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def |   אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def  |  אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def   | אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    |אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '16-18 right word');
 
 selection_test(
@@ -207,13 +207,13 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    h|ij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '16-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hi|j    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '16-34 right word');
 
 selection_test(
@@ -249,43 +249,42 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    o|pq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-40 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    op|q    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-41 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-42 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-43 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-44 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-45 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij    opq    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '16-46 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_17.html
index a9a6c1f..c4e4bdaa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_17.html
@@ -39,127 +39,127 @@
 selection_test(
   '<div contenteditable dir="rtl">    a|bc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    ab|c    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc  |  def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc   | def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    d|ef    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    de|f    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def  |  hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def   | hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc |   def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    h|ij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hi|j    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij  |  אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij   | אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '17-25 right word');
 
 selection_test(
@@ -291,127 +291,126 @@
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    o|pq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-47 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    op|q    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-48 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-49 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-50 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq  |  rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-51 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq   | rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-52 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '17-53 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    r|st    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-54 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rs|t    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-55 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-56 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-57 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst  |  uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-58 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst   | uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-59 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '17-60 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    u|vw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-61 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uv|w    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-62 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-63 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-64 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-65 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-66 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '17-67 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_18.html
index 6abe5fc..72a5718b 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_18.html
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   ופק    </div>',
   '18-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_19.html
index 13a0702..dbb34643 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_19.html
@@ -168,4 +168,3 @@
   '<div contenteditable dir="rtl">    אבצ    abc |   דעפ     </div>',
   '19-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_2.html
index f91fc68..307c950 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_2.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc |   def    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def |   hij    opq    </div>',
   '2-7 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def |   hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   opq    </div>',
   '2-14 right word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    opq|    </div>',
   '2-21 right word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr">    abc    def    hij    opq|    </div>',
   '2-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_20.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_20.html
index 865fc5b..da370d6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_20.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_20.html
@@ -123,13 +123,13 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    a|bc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    ab|c   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-20 right word');
 
 selection_test(
@@ -159,37 +159,37 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   d|ef   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   de|f   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def  | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '20-30 right word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    abc   def   חיח |   ופק    </div>',
   '20-44 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_21.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_21.html
index 2c2d01f..74df90c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_21.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_21.html
@@ -165,109 +165,109 @@
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    a|bc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    ab|c   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc  | def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   d|ef   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-32 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   de|f   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-34 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-35 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def  | jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-36 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-37 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   j|ih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-38 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   ji|h   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-39 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-40 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-41 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih  | ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-42 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '21-43 right word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="rtl">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   '21-63 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_22.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_22.html
index 8bc8cd2..9c9cf85 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_22.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_22.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc| def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc |def    hij opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    |hij opq</div>',
   '22-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def|    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def    |hij opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
   '22-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def |   hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def    |hij opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
   '22-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def  |  hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def    |hij opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
   '22-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def   | hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def    |hij opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
   '22-10 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij| opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij |opq</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij opq|</div>',
   '22-14 right word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">abc def    hij opq|</div>',
   '22-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_23.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_23.html
index 30732c9f..ed9cbc9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_23.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_23.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '23-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '23-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '23-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | abc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '23-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '23-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc |   def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '23-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc  |  def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '23-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc   | def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '23-10 right word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '23-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def |   hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '23-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def  |  hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '23-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def   | hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '23-17 right word');
 
 selection_test(
@@ -135,25 +135,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '23-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij |   opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '23-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij  |  opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '23-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij   | opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '23-24 right word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    opq    |</div>',
   '23-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_24.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_24.html
index 33ea128..060d5ba 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_24.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_24.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    abc    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '24-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   abc    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '24-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  abc    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '24-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | abc    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |\u05D0\u05D1\u05E6    def    </div>',
   '24-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc|    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '24-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc |   אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '24-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc  |  אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '24-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc   | אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |אבצ    def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    |def    </div>',
   '24-10 right word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ|    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '24-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ |   def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '24-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ  |  def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '24-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ   | def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    |def    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    \u05D0\u05D1\u05E6    def    |</div>',
   '24-17 right word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    אבצ    def    |</div>',
   '24-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_25.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_25.html
index 2a53f7b0..1aa6384 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_25.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_25.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | abc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc |   def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc  |  def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc   | def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |\u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-10 right word');
 
 selection_test(
@@ -93,43 +93,43 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def |   אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def  |  אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def   | אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    א|בצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אב|צ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    |\u05D3\u05D3\u05E4    hij    opq    </div>',
   '25-20 right word');
 
 selection_test(
@@ -141,61 +141,61 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ |   דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ  |  דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ   | דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    |דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    ד|דפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דד|פ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '25-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '25-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ |   hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '25-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ  |  hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '25-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ   | hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '25-31 right word');
 
 selection_test(
@@ -219,25 +219,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '25-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij |   opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '25-36 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij  |  opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '25-37 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij   | opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    |opq    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    |</div>',
   '25-38 right word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq    |</div>',
   '25-46 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_26.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_26.html
index 90803646..c16be77 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_26.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_26.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc  |  def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc   | def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-10 right word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def  |  hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def   | hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |\u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-17 right word');
 
 selection_test(
@@ -135,151 +135,151 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij  |  אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij   | אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    א|בצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אב|צ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ  |  דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ   | דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-31 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-32 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    ד|עפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-33 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דע|פ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '26-34 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-36 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ  |  היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-37 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ   | היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-38 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-39 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    ה|יח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-40 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    הי|ח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '26-41 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '26-42 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '26-43 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח  |  opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '26-44 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח   | opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '26-45 right word');
 
 selection_test(
@@ -303,25 +303,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '26-49 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '26-50 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq  |  rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '26-51 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq   | rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '26-52 right word');
 
 selection_test(
@@ -345,25 +345,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '26-56 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '26-57 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst  |  uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '26-58 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst   | uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    |</div>',
   '26-59 right word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
   '26-67 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_27.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_27.html
index b2063227..684a261 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_27.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_27.html
@@ -9,169 +9,169 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '27-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    ח|יח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חי|ח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '27-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח |   ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח  |  ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח   | ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ו|פק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '27-27 right word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    ופק    |</div>',
   '27-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_28.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_28.html
index dc617bc..e0427a0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_28.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_28.html
@@ -9,25 +9,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '28-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '28-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '28-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | אבצ    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |abc    \u05D3\u05E2\u05E4     </div>',
   '28-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '28-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '28-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '28-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |abc    דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    |\u05D3\u05E2\u05E4     </div>',
   '28-10 right word');
 
 selection_test(
@@ -93,25 +93,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc|    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '28-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc |   דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '28-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc  |  דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '28-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc   | דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4     |</div>',
   '28-17 right word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    abc    דעפ     |</div>',
   '28-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_29.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_29.html
index 3f8cd79..28ecd3a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_29.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_29.html
@@ -9,43 +9,43 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-6 right word');
 
 selection_test(
@@ -57,61 +57,61 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-17 right word');
 
 selection_test(
@@ -135,19 +135,19 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   |def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc |  def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   |def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc  | def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   |def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   |\u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '29-23 right word');
 
 selection_test(
@@ -171,37 +171,37 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def  | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   ח|יח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-31 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חי|ח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    |\u05D5\u05E4\u05E7    </div>',
   '29-32 right word');
 
 selection_test(
@@ -213,37 +213,37 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח |   ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-34 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח  |  ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח   | ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-36 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-37 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ו|פק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-38 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    |</div>',
   '29-39 right word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    ופק    |</div>',
   '29-44 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_3.html
index 5e39a81..a06c836 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_3.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc|    אבצ    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc |   אבצ    def    </div>',
+  '<div contenteditable dir="ltr">    abc    \u05D0\u05D1\u05E6 |   def    </div>',
   '3-7 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    אבצ|    def    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    אבצ |   def    </div>',
+  '<div contenteditable dir="ltr">    abc    \u05D0\u05D1\u05E6    def|    </div>',
   '3-14 right word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">    abc    אבצ    def|    </div>',
   '3-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_30.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_30.html
index ceabe2a..c6630a6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_30.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_30.html
@@ -9,151 +9,151 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre"> |   אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">  |  אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">   | אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    א|בצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אב|צ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    |\u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ  |  דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ   | דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    ד|עפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דע|פ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |\u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ  |  חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ   | חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    ח|יח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חי|ח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח  |  abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח   | abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-24 right word');
 
 selection_test(
@@ -177,19 +177,19 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc  | def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-30 right word');
 
 selection_test(
@@ -213,19 +213,19 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-34 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def  | jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   |\u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-36 right word');
 
 selection_test(
@@ -249,109 +249,109 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-40 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-41 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih  | ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-42 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-43 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ו|פק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-44 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופ|ק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  |\u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '30-45 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-46 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-47 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-48 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ו|פק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-49 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופ|ק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    |\u05E8\u05E1\u05EA     </div>',
   '30-50 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-51 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-52 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק  |  רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-53 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק   | רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-54 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-55 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    ר|סת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-56 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רס|ת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     |</div>',
   '30-57 right word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     |</div>',
   '30-63 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_31.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_31.html
index 1bb347e..8dae7f6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_31.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_31.html
@@ -9,109 +9,109 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">א|בצ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אב|צ דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופק|</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ |דעפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ ד|עפ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דע|פ    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    |\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</div>',
   '31-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ |   היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ  |  היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ   | היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    |היח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    ה|יח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    הי|ח ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</div>',
   '31-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ|    היח ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '31-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח |ופק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '31-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ו|פק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '31-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופ|ק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח| ופק</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7|</div>',
   '31-17 right word');
 
 selection_test(
@@ -120,4 +120,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ    היח ופק|</div>',
   '31-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_32.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_32.html
index ce27e3a..e0a14b3 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_32.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_32.html
@@ -9,91 +9,91 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">|אבצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">א|בצ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אב|צ דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij</div>',
   '32-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ |דעפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ ד|עפ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דע|פ היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    abc def hij</div>',
   '32-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ| דעפ היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |abc def hij</div>',
   '32-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ |היח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |abc def hij</div>',
   '32-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ ה|יח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |abc def hij</div>',
   '32-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ הי|ח    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ| היח    abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |abc def hij</div>',
   '32-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח|    abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc |def hij</div>',
   '32-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח |   abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc |def hij</div>',
   '32-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח  |  abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc |def hij</div>',
   '32-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח   | abc def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    |abc def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc |def hij</div>',
   '32-14 right word');
 
 selection_test(
@@ -117,7 +117,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc| def hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc |def hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def |hij</div>',
   '32-18 right word');
 
 selection_test(
@@ -141,7 +141,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc def| hij</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc def |hij</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    abc def hij|</div>',
   '32-22 right word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">אבצ דעפ היח    abc def hij|</div>',
   '32-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_33.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_33.html
index b268c58..6af8e82 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_33.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_33.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc| def hij    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc |def hij    אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def |hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def| hij    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def |hij    אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |\u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-7 right word');
 
 selection_test(
@@ -75,115 +75,115 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij|    אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij |   אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij  |  אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij   | אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    |אבצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    א|בצ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אב|צ דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 |\u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ |דעפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ ד|עפ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דע|פ היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 |\u05D4\u05D9\u05D7    opq rst uvw</div>',
   '33-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ| דעפ היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |opq rst uvw</div>',
   '33-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ |היח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |opq rst uvw</div>',
   '33-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ ה|יח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |opq rst uvw</div>',
   '33-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ הי|ח    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ| היח    opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    |opq rst uvw</div>',
   '33-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח|    opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq |rst uvw</div>',
   '33-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח |   opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq |rst uvw</div>',
   '33-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח  |  opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq |rst uvw</div>',
   '33-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח   | opq rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    |opq rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq |rst uvw</div>',
   '33-29 right word');
 
 selection_test(
@@ -207,7 +207,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq |rst uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst |uvw</div>',
   '33-33 right word');
 
 selection_test(
@@ -231,7 +231,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq rst |uvw</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    \u05D0\u05D1\u05E6 \u05D3\u05E2\u05E4 \u05D4\u05D9\u05D7    opq rst uvw|</div>',
   '33-37 right word');
 
 selection_test(
@@ -258,4 +258,3 @@
   '<div contenteditable dir="ltr" style="white-space:pre">abc def hij    אבצ דעפ היח    opq rst uvw|</div>',
   '33-41 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_34.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_34.html
index be64714..7da98e6 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_34.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_34.html
@@ -15,109 +15,108 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">a|bc def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
   '34-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">ab|c def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
   '34-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
   '34-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
   '34-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc d|ef    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc de|f    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def|    hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def |   hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def  |  hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def   | hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc |def    hij opq</div>',
   '34-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    h|ij opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hi|j opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij| opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    |hij opq</div>',
   '34-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij o|pq</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij op|q</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">|abc def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij opq|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">abc| def    hij opq</div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">abc def    hij |opq</div>',
   '34-18 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_35.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_35.html
index bcae6702..b0636d2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_35.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_35.html
@@ -39,169 +39,168 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
   '35-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    opq    </div>',
   '35-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    h|ij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hi|j    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij |   opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij  |  opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij   | opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    opq    </div>',
   '35-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    o|pq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    op|q    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    opq    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |opq    </div>',
   '35-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_36.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_36.html
index d4c06145..125a0e75 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_36.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_36.html
@@ -162,4 +162,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    אבצ    |def    </div>',
   '36-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_37.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_37.html
index 7ebf298..cd9357c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_37.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_37.html
@@ -39,13 +39,13 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-6 right word');
 
 selection_test(
@@ -81,43 +81,43 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '37-18 right word');
 
 selection_test(
@@ -207,13 +207,13 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    h|ij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hi|j    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    |hij    opq    </div>',
   '37-34 right word');
 
 selection_test(
@@ -249,43 +249,42 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    o|pq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-40 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    op|q    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    |hij    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-41 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-42 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-43 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-44 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-45 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij    opq    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    אבצ    דדפ    hij|    opq    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    |opq    </div>',
   '37-46 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_38.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_38.html
index 56400f8b..3661c1ce 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_38.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_38.html
@@ -39,127 +39,127 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    a|bc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    ab|c    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc  |  def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc   | def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    d|ef    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    de|f    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def  |  hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def   | hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    |def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    h|ij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hi|j    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    |abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij  |  אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij   | אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    |hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '38-25 right word');
 
 selection_test(
@@ -291,127 +291,126 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    o|pq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-47 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    op|q    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-48 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-49 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-50 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq  |  rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-51 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq   | rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-52 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    |rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    |opq    rst    uvw    </div>',
   '38-53 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    r|st    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-54 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rs|t    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-55 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-56 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-57 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst  |  uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-58 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst   | uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-59 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    |uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    |rst    uvw    </div>',
   '38-60 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    u|vw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-61 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uv|w    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    |opq    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-62 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-63 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw |   </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-64 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw  |  </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-65 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw   | </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-66 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw    |</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    |uvw    </div>',
   '38-67 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_39.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_39.html
index 5d375f2..8c80da9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_39.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_39.html
@@ -204,4 +204,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |ופק    </div>',
   '39-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_4.html
index e6a543a6..86a6d7f 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_4.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc|    def    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc |   def    אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def |   \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-7 right word');
 
 selection_test(
@@ -93,43 +93,43 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def|    אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def |   אבצ    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def |   אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def  |  אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def   | אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    |אבצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    א|בצ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אב|צ    דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6 |   \u05D3\u05D3\u05E4    hij    opq    </div>',
   '4-20 right word');
 
 selection_test(
@@ -141,43 +141,43 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ |   דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ  |  דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ   | דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    |דדפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    ד|דפ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דד|פ    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ|    דדפ    hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4 |   hij    opq    </div>',
   '4-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ|    hij    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ |   hij    opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij |   opq    </div>',
   '4-28 right word');
 
 selection_test(
@@ -219,7 +219,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ    hij|    opq    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ    hij |   opq    </div>',
+  '<div contenteditable dir="ltr">    abc    def    \u05D0\u05D1\u05E6    \u05D3\u05D3\u05E4    hij    opq|    </div>',
   '4-35 right word');
 
 selection_test(
@@ -288,4 +288,3 @@
   '<div contenteditable dir="ltr">    abc    def    אבצ    דדפ    hij    opq|    </div>',
   '4-46 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_40.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_40.html
index 4169f00..2fd628e0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_40.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_40.html
@@ -168,4 +168,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    abc    |דעפ     </div>',
   '40-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_41.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_41.html
index ad0e1ae..2a0d8dc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_41.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_41.html
@@ -123,13 +123,13 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    a|bc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    ab|c   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    |abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-20 right word');
 
 selection_test(
@@ -159,37 +159,37 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   d|ef   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   de|f   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    |abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def  | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   |def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '41-30 right word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
   '41-44 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_42.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_42.html
index 2c62a26..10d98d7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_42.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_42.html
@@ -165,109 +165,109 @@
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    a|bc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    ab|c   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc  | def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   |def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    |abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   d|ef   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-32 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   de|f   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-34 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-35 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def  | jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-36 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   |jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   |def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-37 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   j|ih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-38 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   ji|h   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    |abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-39 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-40 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-41 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih  | ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-42 right word');
 
 selection_test(
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="rtl" style="white-space:pre">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   |jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '42-43 right word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="rtl" style="white-space:pre">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
   '42-63 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_43.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_43.html
index d5b6b93..7292d97 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_43.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_43.html
@@ -39,25 +39,25 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大|    笑抬的     abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    |笑抬的     abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11|\u62AC\u7684     abc def</div>',
   '43-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大 |   笑抬的     abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    |笑抬的     abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11|\u62AC\u7684     abc def</div>',
   '43-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大  |  笑抬的     abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    |笑抬的     abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11|\u62AC\u7684     abc def</div>',
   '43-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大   | 笑抬的     abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    |笑抬的     abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11|\u62AC\u7684     abc def</div>',
   '43-8 right word');
 
 selection_test(
@@ -81,31 +81,31 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的|     abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     |abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc |def</div>',
   '43-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的 |    abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     |abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc |def</div>',
   '43-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的  |   abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     |abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc |def</div>',
   '43-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的   |  abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     |abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc |def</div>',
   '43-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的    | abc def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     |abc def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc |def</div>',
   '43-16 right word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     abc| def</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr" style="white-space:pre">人一氧喝大    笑抬的     abc |def</div>',
+  '<div contenteditable dir="ltr" style="white-space:pre">\u4EBA\u4E00\u6C27\u559D\u5927    \u7B11\u62AC\u7684     abc def|</div>',
   '43-20 right word');
 
 selection_test(
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_5.html
index a09933ca..79cb0f9a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_5.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc|    def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc |   def    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def |   hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-7 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def|    hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def |   hij    אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij |   \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-14 right word');
 
 selection_test(
@@ -135,133 +135,133 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij|    אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij |   אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij  |  אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij   | אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    |אבצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    א|בצ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אב|צ    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ |   דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ  |  דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ   | דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-31 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    |דעפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-32 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    ד|עפ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-33 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דע|פ    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D4\u05D9\u05D7    opq    rst    uvw    </div>',
   '5-34 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ|    דעפ    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ |   היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-36 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ  |  היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-37 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ   | היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-38 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    |היח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-39 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    ה|יח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-40 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    הי|ח    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ|    היח    opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7 |   opq    rst    uvw    </div>',
   '5-41 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח|    opq    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח |   opq    rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq |   rst    uvw    </div>',
   '5-42 right word');
 
 selection_test(
@@ -303,7 +303,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq|    rst    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq |   rst    uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst |   uvw    </div>',
   '5-49 right word');
 
 selection_test(
@@ -345,7 +345,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq    rst|    uvw    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq    rst |   uvw    </div>',
+  '<div contenteditable dir="ltr">    abc    def    hij    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D4\u05D9\u05D7    opq    rst    uvw|    </div>',
   '5-56 right word');
 
 selection_test(
@@ -414,4 +414,3 @@
   '<div contenteditable dir="ltr">    abc    def    hij    אבצ    דעפ    היח    opq    rst    uvw|    </div>',
   '5-67 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_6.html
index 92cd30f..0785ec44 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_6.html
@@ -9,169 +9,169 @@
 selection_test(
   '<div contenteditable dir="ltr">|    אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr"> |   אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">  |  אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">   | אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק|    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק|    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק|    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ |   דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ  |  דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ   | דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    |דעפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '6-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ |   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ  |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ   | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    ח|יח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חי|ח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '6-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח  |  ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח   | ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    |ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ו|פק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '6-27 right word');
 
 selection_test(
@@ -204,4 +204,3 @@
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    ופק|    </div>',
   '6-32 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_7.html
index 9da1cdd..39ad9edc 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_7.html
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ|    abc    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ |   abc    דעפ     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    abc |   \u05D3\u05E2\u05E4     </div>',
   '7-7 right word');
 
 selection_test(
@@ -93,7 +93,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    abc|    דעפ     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    abc |   דעפ     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    abc    \u05D3\u05E2\u05E4|     </div>',
   '7-14 right word');
 
 selection_test(
@@ -168,4 +168,3 @@
   '<div contenteditable dir="ltr">    אבצ    abc    דעפ|     </div>',
   '7-26 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_8.html
index 6f1d893..878f9d5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_8.html
@@ -9,43 +9,43 @@
 selection_test(
   '<div contenteditable dir="ltr">|    אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr"> |   אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">  |  אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">   | אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    |אבצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-6 right word');
 
 selection_test(
@@ -57,43 +57,43 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ |   דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ  |  דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ   | דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    |דעפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    abc   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ |   abc   def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc |  def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-14 right word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc|   def   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc |  def   חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def |  \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7    </div>',
   '8-21 right word');
 
 selection_test(
@@ -171,37 +171,37 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def|   חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def |  חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def  | חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   |חיח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   ח|יח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-31 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חי|ח    ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7 |   \u05D5\u05E4\u05E7    </div>',
   '8-32 right word');
 
 selection_test(
@@ -213,37 +213,37 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח |   ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-34 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח  |  ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-35 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח   | ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-36 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    |ופק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-37 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ו|פק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-38 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופ|ק    </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח|    ופק    </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    abc   def   \u05D7\u05D9\u05D7    \u05D5\u05E4\u05E7|    </div>',
   '8-39 right word');
 
 selection_test(
@@ -276,4 +276,3 @@
   '<div contenteditable dir="ltr">    אבצ    דעפ    abc   def   חיח    ופק|    </div>',
   '8-44 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_9.html
index 6acd28f..e08bad2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_multi_space_9.html
@@ -9,133 +9,133 @@
 selection_test(
   '<div contenteditable dir="ltr">|    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr"> |   אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">  |  אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">   | אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    |אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    א|בצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אב|צ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6 |   \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ |   דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ  |  דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ   | דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    |דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    ד|עפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דע|פ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4 |   \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ|    דעפ    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ |   חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ  |  חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ   | חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    |חיח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    ח|יח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חי|ח    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ|    חיח    abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7 |   abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח|    abc   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח |   abc   def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc |  def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-21 right word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc|   def   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc |  def   jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def |  jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-28 right word');
 
 selection_test(
@@ -213,7 +213,7 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def|   jih   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def |  jih   ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih |  \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-34 right word');
 
 selection_test(
@@ -249,109 +249,109 @@
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih|   ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-40 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih |  ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-41 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih  | ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-42 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   |ופק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-43 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ו|פק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-44 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופ|ק  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7 | \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA     </div>',
   '9-45 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-46 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק | ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-47 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  |ופק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-48 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ו|פק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-49 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופ|ק    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7 |   \u05E8\u05E1\u05EA     </div>',
   '9-50 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק|  ופק    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-51 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק |   רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-52 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק  |  רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-53 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק   | רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-54 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    |רסת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-55 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    ר|סת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-56 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רס|ת     </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק|    רסת     </div>',
+  '<div contenteditable dir="ltr">    \u05D0\u05D1\u05E6    \u05D3\u05E2\u05E4    \u05D7\u05D9\u05D7    abc   def   jih   \u05D5\u05E4\u05E7  \u05D5\u05E4\u05E7    \u05E8\u05E1\u05EA|     </div>',
   '9-57 right word');
 
 selection_test(
@@ -390,4 +390,3 @@
   '<div contenteditable dir="ltr">    אבצ    דעפ    חיח    abc   def   jih   ופק  ופק    רסת|     </div>',
   '9-63 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_1.html
index e4a0dfc..101bd6aa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_1.html
@@ -9,19 +9,19 @@
 selection_test(
   '<div contenteditable dir="ltr">|אאא <span>בב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |<span>\u05D1\u05D1</span></div>',
   '1-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|אא <span>בב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא <span>בב|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |<span>\u05D1\u05D1</span></div>',
   '1-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א <span>בב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא <span>בב|</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |<span>\u05D1\u05D1</span></div>',
   '1-2 right word');
 
 selection_test(
@@ -33,19 +33,19 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא |<span>בב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 <span>\u05D1\u05D1|</span></div>',
   '1-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא <span>|בב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 <span>\u05D1\u05D1|</span></div>',
   '1-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא <span>ב|ב</span></div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| <span>בב</span></div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 <span>\u05D1\u05D1|</span></div>',
   '1-6 right word');
 
 selection_test(
@@ -54,4 +54,3 @@
   '<div contenteditable dir="ltr">אאא <span>בב|</span></div>',
   '1-7 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_10.html
index ecdb28b..5b9bcf5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_10.html
@@ -9,145 +9,145 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבד דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span>היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>|היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>ה|יח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>הי|ח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '10-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span>היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח |ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ו|פק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופ|ק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '10-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '10-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '10-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '10-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '10-23 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="ltr">אבד דעפ <span>היח ופק</span>ווש כטז|</div>',
   '10-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_11.html
index 61670b62..aa5eef2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_11.html
@@ -69,13 +69,13 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">a|bc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">ab|c def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="ltr">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-11 right word');
 
 selection_test(
@@ -93,49 +93,49 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span dir="ltr">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span dir="ltr">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="ltr">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '11-21 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">abc def</span>ווש |כטז</div>',
   '11-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_12.html
index c5467fd..bda68b0 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_12.html
@@ -9,49 +9,49 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '12-7 right word');
 
 selection_test(
@@ -81,73 +81,73 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc| def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc |def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc |def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '12-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '12-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '12-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '12-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '12-23 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">abc def</span>ווש כטז|</div>',
   '12-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_13.html
index b24e4ef..62a7ea9 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_13.html
@@ -69,13 +69,13 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>a|bc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>ab|c def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-11 right word');
 
 selection_test(
@@ -93,49 +93,49 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד דעפ <span>abc| def</span>ווש כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '13-21 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span>abc def</span>ווש |כטז</div>',
   '13-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_14.html
index da30a00..6ca8abf 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_14.html
@@ -9,19 +9,19 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבד דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-2 right word');
 
 selection_test(
@@ -33,25 +33,25 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span>abc def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ |<span>abc def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc |def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '14-7 right word');
 
 selection_test(
@@ -81,49 +81,49 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc| def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc |def</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc |def</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc d|ef</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc de|f</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '14-19 right word');
 
 selection_test(
@@ -135,19 +135,19 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '14-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '14-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span>abc def</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '14-23 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="ltr">אבד דעפ <span>abc def</span>ווש כטז|</div>',
   '14-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_15.html
index f8c1178..5dd1960 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_15.html
@@ -93,19 +93,19 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">a|bc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">ab|c אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="ltr">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-16 right word');
 
 selection_test(
@@ -135,55 +135,55 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא |def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ |<span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא d|ef</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ |<span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא de|f</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ |<span dir="ltr">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def|</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>|ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ו|וש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>וו|ש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש |rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc| אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="ltr">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '15-29 right word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="rtl">אבד opq דעפ <span dir="ltr">abc אאא def</span>ווש rst |כטז</div>',
   '15-36 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_16.html
index 512648a5..9ed26ab5 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_16.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד| opq דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד |opq דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-3 right word');
 
 selection_test(
@@ -51,133 +51,133 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq| דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq |דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq |דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq ד|עפ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דע|פ <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">|abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">a|bc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">ab|c אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc| אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ| <span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc |אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc א|אא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אא|א def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '16-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span dir="rtl">abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא d|ef</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא de|f</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def|</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>|ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא| def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ו|וש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>וו|ש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '16-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst |\u05DB\u05D8\u05D6</div>',
   '16-28 right word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש rst| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש rst |כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span dir="rtl">abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6|</div>',
   '16-32 right word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="ltr">אבד opq דעפ <span dir="rtl">abc אאא def</span>ווש rst כטז|</div>',
   '16-36 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_17.html
index 30d8bf1..44e5ed13 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_17.html
@@ -228,4 +228,3 @@
   '<div contenteditable dir="rtl">אבד opq דעפ <span>abc אאא def</span>ווש rst |כטז</div>',
   '17-36 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_18.html
index e726ee1..909510a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_18.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד| opq דעפ <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד |opq דעפ <span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq |\u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '18-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq| דעפ <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq |דעפ <span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 |<span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '18-7 right word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ| <span>abc אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ |<span>abc אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc |\u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '18-11 right word');
 
 selection_test(
@@ -105,7 +105,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc| אאא def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span>abc |אאא def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 |def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6</div>',
   '18-16 right word');
 
 selection_test(
@@ -129,7 +129,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא| def</span>ווש rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא |def</span>ווש rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 |rst \u05DB\u05D8\u05D6</div>',
   '18-20 right word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש| rst כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש |rst כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst |\u05DB\u05D8\u05D6</div>',
   '18-28 right word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש rst| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש rst |כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 opq \u05D3\u05E2\u05E4 <span>abc \u05D0\u05D0\u05D0 def</span>\u05D5\u05D5\u05E9 rst \u05DB\u05D8\u05D6|</div>',
   '18-32 right word');
 
 selection_test(
@@ -228,4 +228,3 @@
   '<div contenteditable dir="ltr">אבד opq דעפ <span>abc אאא def</span>ווש rst כטז|</div>',
   '18-36 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_19.html
index 836b4db..7d5b419 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_19.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa| <span>bbb אאא </span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa |<span>bbb אאא </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb |\u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9</div>',
   '19-3 right word');
 
 selection_test(
@@ -57,25 +57,25 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb| אאא </span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb |אאא </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb |אאא </span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb א|אא </span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ווש|</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אא|א </span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ווש|</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 |</span>\u05D5\u05D5\u05E9</div>',
   '19-11 right word');
 
 selection_test(
@@ -87,25 +87,25 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא |</span>ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9|</div>',
   '19-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>|ווש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9|</div>',
   '19-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ו|וש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9|</div>',
   '19-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>וו|ש</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa <span>bbb אאא| </span>ווש</div>',
+  '<div contenteditable dir="ltr">aaa <span>bbb \u05D0\u05D0\u05D0 </span>\u05D5\u05D5\u05E9|</div>',
   '19-16 right word');
 
 selection_test(
@@ -114,4 +114,3 @@
   '<div contenteditable dir="ltr">aaa <span>bbb אאא </span>ווש|</div>',
   '19-17 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_2.html
index 47d3ef47..7605570a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_2.html
@@ -54,4 +54,3 @@
   '<div contenteditable dir="rtl">אאא |<span>בב</span></div>',
   '2-7 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_20.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_20.html
index 9bcee11..1ea73eb 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_20.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_20.html
@@ -39,13 +39,13 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד o|pq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 |opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד op|q rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 |opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-6 right word');
 
 selection_test(
@@ -63,25 +63,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq r|st דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד |opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rs|t דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד |opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst| דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst |דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq| rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq |rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-12 right word');
 
 selection_test(
@@ -117,49 +117,49 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">a|bc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 |<span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">ab|c uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 |<span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 |<span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc |uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 |<span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc u|vw אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uv|w אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw| אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw |אאא def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc |uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-25 right word');
 
 selection_test(
@@ -183,96 +183,92 @@
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא |def lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw |\u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא d|ef lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא de|f lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def| lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-32 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def |lmn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 |def lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def l|mn</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-34 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lm|n</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ |<span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-35 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn|</span>אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-36 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>|אבצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-37 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>א|בצ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-38 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אב|צ hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-39 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ| hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-40 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc| uvw אאא def lmn</span>אבצ hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def |lmn</span>\u05D0\u05D1\u05E6 hij xyz \u05D5\u05E7\u05E7</div>',
   '20-41 right word');
 
-/*
- * TODO(xiaochengh): These tests currently fail on Windows.
- * Make them pass after changing left/right caret movements to logical.
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ h|ij xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-42 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hi|j xyz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 |hij xyz \u05D5\u05E7\u05E7</div>',
   '20-43 right word');
-*/
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
@@ -286,33 +282,29 @@
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
   '20-45 right word');
 
-/*
- * TODO(xiaochengh): These tests currently fail on Windows.
- * Make them pass after changing left/right caret movements to logical.
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij x|yz וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-46 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xy|z וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ |hij xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-47 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz| וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-48 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz |וקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij| xyz וקק</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D1\u05D3 opq rst \u05D3\u05E2\u05E4 <span dir="ltr">abc uvw \u05D0\u05D0\u05D0 def lmn</span>\u05D0\u05D1\u05E6 hij |xyz \u05D5\u05E7\u05E7</div>',
   '20-49 right word');
-*/
 
 selection_test(
   '<div contenteditable dir="rtl">אבד opq rst דעפ <span dir="ltr">abc uvw אאא def lmn</span>אבצ hij xyz ו|קק</div>',
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_3.html
index a08cd70..905fa716 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_3.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def |<span>hij opq</span> rst uvw</div>',
   '3-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |<span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span>hij |opq</span> rst uvw</div>',
   '3-7 right word');
 
 selection_test(
@@ -81,7 +81,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span>hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span>hij |opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span>hij opq</span> |rst uvw</div>',
   '3-12 right word');
 
 selection_test(
@@ -105,13 +105,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span>hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span>hij opq</span> |rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst |uvw</div>',
   '3-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def <span>hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span>hij opq</span> |rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst |uvw</div>',
   '3-17 right word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst |uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst uvw|</div>',
   '3-21 right word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">abc def <span>hij opq</span> rst uvw|</div>',
   '3-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_4.html
index ae35de7..b80dcf9d 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_4.html
@@ -15,151 +15,150 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
   '4-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
   '4-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
   '4-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
   '4-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| <span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>|hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span>hij opq</span> rst uvw</div>',
   '4-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>h|ij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hi|j opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span>hij opq</span> rst uvw</div>',
   '4-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij o|pq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij op|q</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij |opq</span> rst uvw</div>',
   '4-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> r|st uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rs|t uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> |rst uvw</div>',
   '4-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst u|vw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uv|w</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst uvw|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span>hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span>hij opq</span> rst |uvw</div>',
   '4-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_5.html
index 82668a380..138994ea 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_5.html
@@ -15,151 +15,150 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| <span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">|hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc |def <span dir="ltr">hij opq</span> rst uvw</div>',
   '5-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">h|ij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hi|j opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def |<span dir="ltr">hij opq</span> rst uvw</div>',
   '5-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij o|pq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij op|q</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij |opq</span> rst uvw</div>',
   '5-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> r|st uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rs|t uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> |rst uvw</div>',
   '5-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst u|vw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uv|w</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-24 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst uvw|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def <span dir="ltr">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="rtl">abc def <span dir="ltr">hij opq</span> rst |uvw</div>',
   '5-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_6.html
index f2b6296..a1aece4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_6.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def <span dir="rtl">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def <span dir="rtl">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def |<span dir="rtl">hij opq</span> rst uvw</div>',
   '6-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| <span dir="rtl">hij opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |<span dir="rtl">hij opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij |opq</span> rst uvw</div>',
   '6-7 right word');
 
 selection_test(
@@ -81,7 +81,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij| opq</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij |opq</span> rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> |rst uvw</div>',
   '6-12 right word');
 
 selection_test(
@@ -105,13 +105,13 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq|</span> rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> |rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst |uvw</div>',
   '6-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span>| rst uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> |rst uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst |uvw</div>',
   '6-17 right word');
 
 selection_test(
@@ -135,7 +135,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst| uvw</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst |uvw</div>',
+  '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst uvw|</div>',
   '6-21 right word');
 
 selection_test(
@@ -162,4 +162,3 @@
   '<div contenteditable dir="ltr">abc def <span dir="rtl">hij opq</span> rst uvw|</div>',
   '6-25 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_7.html
index a08fdcd..b20f0bbe 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_7.html
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span dir="ltr">היח ופק</span>ווש |כטז</div>',
   '7-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_8.html
index 840bcd6d..c6e8f95 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_8.html
@@ -9,145 +9,145 @@
 selection_test(
   '<div contenteditable dir="ltr">|אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|בד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אב|ד דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 |\u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד |דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד ד|עפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דע|פ <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 |<span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד| דעפ <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ |<span dir="rtl">היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">|היח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">ה|יח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">הי|ח ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 |\u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6</div>',
   '8-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ| <span dir="rtl">היח ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח |ופק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ו|פק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופ|ק</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק|</span>ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>|ווש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ו|וש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>וו|ש כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 |\u05DB\u05D8\u05D6</div>',
   '8-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח| ופק</span>ווש כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '8-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש |כטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '8-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כ|טז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '8-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כט|ז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש| כטז</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D1\u05D3 \u05D3\u05E2\u05E4 <span dir="rtl">\u05D4\u05D9\u05D7 \u05D5\u05E4\u05E7</span>\u05D5\u05D5\u05E9 \u05DB\u05D8\u05D6|</div>',
   '8-23 right word');
 
 selection_test(
@@ -156,4 +156,3 @@
   '<div contenteditable dir="ltr">אבד דעפ <span dir="rtl">היח ופק</span>ווש כטז|</div>',
   '8-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_9.html
index 1872043b..052aaf4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_inline_element_9.html
@@ -156,4 +156,3 @@
   '<div contenteditable dir="rtl">אבד דעפ <span>היח ופק</span>ווש |כטז</div>',
   '9-24 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_1.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_1.html
index f1275f4..c1eee6a 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_1.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_1.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def hij opq rst</div>',
+  '<div contenteditable dir="ltr">abc def |hij opq rst</div>',
   '1-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |hij opq rst</div>',
+  '<div contenteditable dir="ltr">abc def hij |opq rst</div>',
   '1-7 right word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij| opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |opq rst</div>',
+  '<div contenteditable dir="ltr">abc def hij opq |rst</div>',
   '1-11 right word');
 
 selection_test(
@@ -99,7 +99,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij opq| rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij opq |rst</div>',
+  '<div contenteditable dir="ltr">abc def hij opq rst|</div>',
   '1-15 right word');
 
 selection_test(
@@ -126,4 +126,3 @@
   '<div contenteditable dir="ltr">abc def hij opq rst|</div>',
   '1-19 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_10.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_10.html
index 27c6ef7..6927a38 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_10.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_10.html
@@ -78,4 +78,3 @@
   '<div contenteditable dir="rtl">aaa אאא |bbb</div>',
   '10-11 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_11.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_11.html
index fe8572c..b6f75aa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_11.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_11.html
@@ -9,73 +9,73 @@
 selection_test(
   '<div contenteditable dir="ltr">|אאא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|אא בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא |בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא ב|בב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בב|ב צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב |צצצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צ|צצ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצ|צ aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב| צצצ aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ| aaa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-11 right word');
 
 selection_test(
@@ -99,7 +99,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa |bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-15 right word');
 
 selection_test(
@@ -123,7 +123,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb |ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc |\u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-19 right word');
 
 selection_test(
@@ -147,73 +147,73 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc| דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-23 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-24 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc ד|דד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-25 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דד|ד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 |\u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '11-26 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-27 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד |עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-28 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד ע|עע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-29 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עע|ע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 |\u05E4\u05E4\u05E4</div>',
   '11-30 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד| עעע פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4|</div>',
   '11-31 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע |פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4|</div>',
   '11-32 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פ|פפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4|</div>',
   '11-33 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפ|פ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע| פפפ</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4|</div>',
   '11-34 right word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="ltr">אאא בבב צצצ aaa bbb ccc דדד עעע פפפ|</div>',
   '11-35 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_12.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_12.html
index 65c3f750..906798e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_12.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_12.html
@@ -87,73 +87,73 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ a|aa bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aa|a bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa |bbb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |aaa bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa b|bb ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bb|b ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb| ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-19 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb |ccc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa |bbb ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-20 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb c|cc דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb cc|c דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ |aaa bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc| דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-23 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc |דדד עעע פפפ</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב צצצ aaa| bbb ccc דדד עעע פפפ</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 aaa bbb |ccc \u05D3\u05D3\u05D3 \u05E2\u05E2\u05E2 \u05E4\u05E4\u05E4</div>',
   '12-24 right word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="rtl">אאא בבב צצצ aaa bbb ccc דדד עעע |פפפ</div>',
   '12-35 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_13.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_13.html
index e6f817e..6d7a7f8 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_13.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_13.html
@@ -9,19 +9,19 @@
 selection_test(
   '<div contenteditable dir="ltr">|אאא בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">א|אא בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אא|א בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-2 right word');
 
 selection_test(
@@ -33,25 +33,25 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא |בבב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא ב|בב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בב|ב aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא| בבב aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב| aaa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-7 right word');
 
 selection_test(
@@ -75,7 +75,7 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa| bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa |bbb צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb |\u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '13-11 right word');
 
 selection_test(
@@ -99,25 +99,25 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb| צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb |צצצ דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb |צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צ|צצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דדד|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצ|צ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דדד|</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 |\u05D3\u05D3\u05D3</div>',
   '13-18 right word');
 
 selection_test(
@@ -129,19 +129,19 @@
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ |דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3|</div>',
   '13-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ ד|דד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3|</div>',
   '13-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דד|ד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ| דדד</div>',
+  '<div contenteditable dir="ltr">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3|</div>',
   '13-22 right word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="ltr">אאא בבב aaa bbb צצצ דדד|</div>',
   '13-23 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_14.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_14.html
index eb351cc..535598c 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_14.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_14.html
@@ -63,13 +63,13 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב a|aa bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aa|a bbb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |aaa bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-10 right word');
 
 selection_test(
@@ -87,25 +87,25 @@
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa b|bb צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bb|b צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב |aaa bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bbb| צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">אאא בבב aaa bbb |צצצ דדד</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">אאא בבב aaa| bbb צצצ דדד</div>',
+  '<div contenteditable dir="rtl">\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 aaa |bbb \u05E6\u05E6\u05E6 \u05D3\u05D3\u05D3</div>',
   '14-16 right word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="rtl">אאא בבב aaa bbb צצצ |דדד</div>',
   '14-23 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_15.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_15.html
index c8632988..7d72770 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_15.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_15.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">שנב| abc סטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">שנב |abc סטז</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E0\u05D1 abc |\u05E1\u05D8\u05D6</div>',
   '15-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">שנב abc| סטז</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">שנב abc |סטז</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E0\u05D1 abc \u05E1\u05D8\u05D6|</div>',
   '15-7 right word');
 
 selection_test(
@@ -78,4 +78,3 @@
   '<div contenteditable dir="ltr">שנב abc סטז|</div>',
   '15-11 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_16.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_16.html
index 4ddbba0..6b1d80a2 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_16.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_16.html
@@ -78,4 +78,3 @@
   '<div contenteditable dir="rtl">שנב abc |סטז</div>',
   '16-11 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_17.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_17.html
index 119d7b4..088bedfa 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_17.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_17.html
@@ -9,85 +9,85 @@
 selection_test(
   '<div contenteditable dir="ltr">|abc \u202Bבאד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc |\u202B\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">a|bc \u202Bבאד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc |\u202B\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ab|c \u202Bבאד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc |\u202B\u05D1\u05D0\u05D3 def\u202C xyz</div>',
   '17-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc| \u202Bבאד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc |\u202Bבאד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202B|באד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bב|אד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבא|ד def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 |def\u202C xyz</div>',
   '17-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד |def\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד d|ef\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד de|f\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד| def\u202C xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד def|\u202C xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C| xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C |xyz</div>',
+  '<div contenteditable dir="ltr">abc \u202B\u05D1\u05D0\u05D3 def\u202C xyz|</div>',
   '17-13 right word');
 
 selection_test(
@@ -114,4 +114,3 @@
   '<div contenteditable dir="ltr">abc \u202Bבאד def\u202C xyz|</div>',
   '17-17 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_18.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_18.html
index a0cafd7..9f5e2bae4 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_18.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_18.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
+  '<div contenteditable dir="ltr">abc def |hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   '18-3 right word');
 
 selection_test(
@@ -51,43 +51,43 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij |<img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   '18-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def |hij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij |<img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   '18-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def h|ij <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij |<img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   '18-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hi|j <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij |<img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   '18-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij| <img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq |rst </div>',
   '18-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij |<img src="../../../accessibility/resources/cake.png"> opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq |rst </div>',
   '18-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png">| opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq |rst </div>',
   '18-13 right word');
 
 selection_test(
@@ -111,7 +111,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq| rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq |rst </div>',
+  '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq rst| </div>',
   '18-17 right word');
 
 selection_test(
@@ -144,4 +144,3 @@
   '<div contenteditable dir="ltr">abc def hij <img src="../../../accessibility/resources/cake.png"> opq rst| </div>',
   '18-22 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_19.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_19.html
index 507e269..67c28d9d7 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_19.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_19.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def this<span>is</span><span>one</span><span>word</span>end opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def this<span>is</span><span>one</span><span>word</span>end opq rst </div>',
+  '<div contenteditable dir="ltr">abc def |this<span>is</span><span>one</span><span>word</span>end opq rst </div>',
   '19-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| this<span>is</span><span>one</span><span>word</span>end opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |this<span>is</span><span>one</span><span>word</span>end opq rst </div>',
+  '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end |opq rst </div>',
   '19-7 right word');
 
 selection_test(
@@ -177,7 +177,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end| opq rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end |opq rst </div>',
+  '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq |rst </div>',
   '19-28 right word');
 
 selection_test(
@@ -201,7 +201,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq| rst </div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq |rst </div>',
+  '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq rst| </div>',
   '19-32 right word');
 
 selection_test(
@@ -234,4 +234,3 @@
   '<div contenteditable dir="ltr">abc def this<span>is</span><span>one</span><span>word</span>end opq rst| </div>',
   '19-37 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_2.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_2.html
index af05494..1d7385e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_2.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_2.html
@@ -15,115 +15,114 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
   '2-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
   '2-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
   '2-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
   '2-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc |def hij opq rst</div>',
   '2-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def h|ij opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hi|j opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij| opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def |hij opq rst</div>',
   '2-12 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij o|pq rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-13 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij op|q rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-14 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq| rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-15 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij |opq rst</div>',
   '2-16 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq r|st</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq rs|t</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-18 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij opq rst|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij opq rst</div>',
+  '<div contenteditable dir="rtl">abc def hij opq |rst</div>',
   '2-19 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_3.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_3.html
index 2ffa8fa6..42545a63 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_3.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_3.html
@@ -9,115 +9,115 @@
 selection_test(
   '<div contenteditable dir="ltr">|ששש נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-0 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ש|שש נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג קקק|</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-1 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">שש|ש נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג קקק|</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 |\u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-2 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג קקק|</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-3 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש |נננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-4 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נ|ננ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-5 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש ננ|נ בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 |\u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-6 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש| נננ בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ |בבב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ ב|בב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בב|ב גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 |\u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7</div>',
   '3-10 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ| בבב גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב |גגג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב ג|גג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גג|ג קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 |\u05E7\u05E7\u05E7</div>',
   '3-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב| גגג קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7|</div>',
   '3-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג |קקק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7|</div>',
   '3-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג ק|קק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7|</div>',
   '3-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">ששש נננ בבב גגג קק|ק</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">ששש נננ בבב גגג| קקק</div>',
+  '<div contenteditable dir="ltr">\u05E9\u05E9\u05E9 \u05E0\u05E0\u05E0 \u05D1\u05D1\u05D1 \u05D2\u05D2\u05D2 \u05E7\u05E7\u05E7|</div>',
   '3-18 right word');
 
 selection_test(
@@ -126,4 +126,3 @@
   '<div contenteditable dir="ltr">ששש נננ בבב גגג קקק|</div>',
   '3-19 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_4.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_4.html
index 7a9595e..fc5f461 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_4.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_4.html
@@ -126,4 +126,3 @@
   '<div contenteditable dir="rtl">ששש נננ בבב גגג |קקק</div>',
   '4-19 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_5.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_5.html
index ffa6f64..043bf1e 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_5.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_5.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij |\u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-7 right word');
 
 selection_test(
@@ -75,79 +75,79 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij| אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-11 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij א|אא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אא|א בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 |\u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-15 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא |בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-16 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא ב|בב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-17 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בב|ב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 |\u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '5-18 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא| בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '5-19 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב |צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '5-20 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צ|צצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '5-21 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצ|צ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב| צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '5-22 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ| opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '5-23 right word');
 
 selection_test(
@@ -171,7 +171,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr |uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '5-27 right word');
 
 selection_test(
@@ -195,7 +195,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr uvw |xyz</div>',
+  '<div contenteditable dir="ltr">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz|</div>',
   '5-31 right word');
 
 selection_test(
@@ -222,4 +222,3 @@
   '<div contenteditable dir="ltr">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
   '5-35 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_6.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_6.html
index ca0980f..c9a5d04 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_6.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_6.html
@@ -15,73 +15,73 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-2 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-3 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc |def hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-4 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |hij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-8 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def h|ij אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-9 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hi|j אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-10 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij| אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-11 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij |אאא בבב צצצ opr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def hij אאא בבב צצצ opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def |hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw xyz</div>',
   '6-12 right word');
 
 selection_test(
@@ -159,67 +159,66 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ o|pr uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '6-25 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ op|r uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '6-26 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '6-27 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr |uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 |opr uvw xyz</div>',
   '6-28 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr u|vw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-29 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uv|w xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-30 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw| xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-31 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw |xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr |uvw xyz</div>',
   '6-32 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw x|yz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-33 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xy|z</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ |opr uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-34 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr uvw xyz|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def hij אאא בבב צצצ opr| uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def hij \u05D0\u05D0\u05D0 \u05D1\u05D1\u05D1 \u05E6\u05E6\u05E6 opr uvw |xyz</div>',
   '6-35 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_7.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_7.html
index d3a0bf7..6e5633e1 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_7.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_7.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc| def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc |def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def |\u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-3 right word');
 
 selection_test(
@@ -51,25 +51,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def| שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def |שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-7 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def |שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-8 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def ש|נב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-9 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנ|ב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 |\u05E1\u05D8\u05D6 uvw xyz</div>',
   '7-10 right word');
 
 selection_test(
@@ -81,25 +81,25 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב |סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '7-12 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב ס|טז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '7-13 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סט|ז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב| סטז uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '7-14 right word');
 
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סטז| uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '7-15 right word');
 
 selection_test(
@@ -123,7 +123,7 @@
 selection_test(
   '<div contenteditable dir="ltr">abc def שנב סטז uvw| xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">abc def שנב סטז uvw |xyz</div>',
+  '<div contenteditable dir="ltr">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz|</div>',
   '7-19 right word');
 
 selection_test(
@@ -150,4 +150,3 @@
   '<div contenteditable dir="ltr">abc def שנב סטז uvw xyz|</div>',
   '7-23 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_8.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_8.html
index f400e2b..0387d63 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_8.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_8.html
@@ -15,13 +15,13 @@
 selection_test(
   '<div contenteditable dir="rtl">a|bc def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-1 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">ab|c def שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">|abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-2 right word');
 
 selection_test(
@@ -39,25 +39,25 @@
 selection_test(
   '<div contenteditable dir="rtl">abc d|ef שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-5 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc de|f שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">|abc def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-6 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def| שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-7 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def |שנב סטז uvw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc| def שנב סטז uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc |def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw xyz</div>',
   '8-8 right word');
 
 selection_test(
@@ -111,13 +111,13 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז u|vw xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '8-17 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uv|w xyz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 |uvw xyz</div>',
   '8-18 right word');
 
 selection_test(
@@ -135,19 +135,18 @@
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw x|yz</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-21 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw xy|z</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז |uvw xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-22 right word');
 
 selection_test(
   '<div contenteditable dir="rtl">abc def שנב סטז uvw xyz|</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="rtl">abc def שנב סטז uvw| xyz</div>',
+  '<div contenteditable dir="rtl">abc def \u05E9\u05E0\u05D1 \u05E1\u05D8\u05D6 uvw |xyz</div>',
   '8-23 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_9.html b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_9.html
index 7bd1476..0bc1294 100644
--- a/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_9.html
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_right_word_visually_single_space_one_element_9.html
@@ -27,7 +27,7 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa| אאא bbb</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa |אאא bbb</div>',
+  '<div contenteditable dir="ltr">aaa \u05D0\u05D0\u05D0 |bbb</div>',
   '9-3 right word');
 
 selection_test(
@@ -51,7 +51,7 @@
 selection_test(
   '<div contenteditable dir="ltr">aaa אאא| bbb</div>',
   selection => selection.modify('move', 'right', 'word'),
-  '<div contenteditable dir="ltr">aaa אאא |bbb</div>',
+  '<div contenteditable dir="ltr">aaa \u05D0\u05D0\u05D0 bbb|</div>',
   '9-7 right word');
 
 selection_test(
@@ -78,4 +78,3 @@
   '<div contenteditable dir="ltr">aaa אאא bbb|</div>',
   '9-11 right word');
 </script>
-
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index f51a33d..88523d1 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -6811,6 +6811,12 @@
      {}
     ]
    ],
+   "speech-api/SpeechSynthesisUtterance-volume-manual.html": [
+    [
+     "speech-api/SpeechSynthesisUtterance-volume-manual.html",
+     {}
+    ]
+   ],
    "storage/persist-permission-manual.https.html": [
     [
      "storage/persist-permission-manual.https.html",
@@ -62663,6 +62669,30 @@
      {}
     ]
    ],
+   "css/css-text/hyphens/hyphens-out-of-flow-001.html": [
+    [
+     "css/css-text/hyphens/hyphens-out-of-flow-001.html",
+     [
+      [
+       "/css/css-text/hyphens/reference/hyphens-span-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-text/hyphens/hyphens-out-of-flow-002.html": [
+    [
+     "css/css-text/hyphens/hyphens-out-of-flow-002.html",
+     [
+      [
+       "/css/css-text/hyphens/reference/hyphens-span-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-text/hyphens/hyphens-shaping-001.html": [
     [
      "css/css-text/hyphens/hyphens-shaping-001.html",
@@ -202136,11 +202166,6 @@
      {}
     ]
    ],
-   "webrtc/RTCRtpTransceiver-setCodecPreferences-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "webrtc/RTCRtpTransceiver-stop-expected.txt": [
     [
      {}
@@ -228836,6 +228861,12 @@
      {}
     ]
    ],
+   "css/css-contain/contain-size-grid-003.html": [
+    [
+     "css/css-contain/contain-size-grid-003.html",
+     {}
+    ]
+   ],
    "css/css-contain/contain-size-multicol-as-flex-item.html": [
     [
      "css/css-contain/contain-size-multicol-as-flex-item.html",
@@ -305032,6 +305063,12 @@
      {}
     ]
    ],
+   "shape-detection/detection-ImageData-detached.html": [
+    [
+     "shape-detection/detection-ImageData-detached.html",
+     {}
+    ]
+   ],
    "shape-detection/detection-ImageData.html": [
     [
      "shape-detection/detection-ImageData.html",
@@ -372182,6 +372219,10 @@
    "43361c298343117362f35596611a9faf854cea47",
    "reftest"
   ],
+  "css/css-contain/contain-size-grid-003.html": [
+   "e146b8859206bd4af41b37239fe0ac95a5d2a178",
+   "testharness"
+  ],
   "css/css-contain/contain-size-monolithic-001.html": [
    "30f19b6cbbd6f6737d5175b1946c17805e0568d6",
    "reftest"
@@ -397174,6 +397215,14 @@
    "39814d3e18c622c022d5e3314580ebb187d217da",
    "reftest"
   ],
+  "css/css-text/hyphens/hyphens-out-of-flow-001.html": [
+   "05d78b2c6cc974eb736983d5e9e054ca7db7c95a",
+   "reftest"
+  ],
+  "css/css-text/hyphens/hyphens-out-of-flow-002.html": [
+   "0b88adaed8fa8be943706cb043b02785d601ac8b",
+   "reftest"
+  ],
   "css/css-text/hyphens/hyphens-shaping-001.html": [
    "0cd2243bdac0e89add0223c03ba2328cb239c980",
    "reftest"
@@ -475003,7 +475052,7 @@
    "testharness"
   ],
   "portals/portals-activate-inside-portal.html": [
-   "97cbeb8b9db7b8d81b85451c90344227e41e30c0",
+   "efeb23d4e38d21627be812fa85bbd5d74ba83da4",
    "testharness"
   ],
   "portals/portals-activate-no-browsing-context.html": [
@@ -475047,7 +475096,7 @@
    "testharness"
   ],
   "portals/portals-no-referrer.html": [
-   "0386272f441a0c2e19452821968a624d3ab16700",
+   "1bd68a1c4a21ed3d2db559f7d7c62c187215e40c",
    "testharness"
   ],
   "portals/portals-post-message.sub.html": [
@@ -475071,7 +475120,7 @@
    "support"
   ],
   "portals/resources/portal-activate-inside-portal.html": [
-   "9c9c4df6695909cbe3dc64e9f8f72b918fa58dd3",
+   "c6dc0bb68b30777b48d7bb69c72c62dc601619dd",
    "support"
   ],
   "portals/resources/portal-activate-twice-window-1.html": [
@@ -475123,11 +475172,11 @@
    "support"
   ],
   "portals/resources/portal-post-message-before-activate-portal.html": [
-   "94cae0f010ec3253c4da56b52836646daf351ac5",
+   "9e6c9a38958e35d754af918bb060a8bfe7ad28c5",
    "support"
   ],
   "portals/resources/portal-post-message-before-activate-window.html": [
-   "55fe61126445eddcfc5d83464604c34b2df0f9b7",
+   "36c0ccc742f24c09773f162eb8bf532f34333d05",
    "support"
   ],
   "portals/resources/portal-post-message-during-activate-window.html": [
@@ -475155,7 +475204,7 @@
    "support"
   ],
   "portals/resources/postmessage-referrer.sub.html": [
-   "6897ab0801d8d0408913a5a44c03a022c983121e",
+   "92aef00380ae4a6180039ad0b10169c81a190441",
    "support"
   ],
   "portals/resources/simple-portal.html": [
@@ -490198,6 +490247,10 @@
    "a7157c0960eb463b953576e00bb9628cd48df73d",
    "testharness"
   ],
+  "shape-detection/detection-ImageData-detached.html": [
+   "6b6060f089eb5629e8625a8e58f9a0348f2988be",
+   "testharness"
+  ],
   "shape-detection/detection-ImageData.html": [
    "a74c2afbe1bcde274793853c593c662f4b161e91",
    "testharness"
@@ -490822,6 +490875,10 @@
    "2fd394150e941ccbeb8d63b99e598cc53e55446d",
    "testharness"
   ],
+  "speech-api/SpeechSynthesisUtterance-volume-manual.html": [
+   "f340ba8bb273593eacfe396b46f7fdec9a409798",
+   "manual"
+  ],
   "speech-api/historical-expected.txt": [
    "ebdbc55fd4658f55caf39ddafb50524125f0907f",
    "support"
@@ -503947,7 +504004,7 @@
    "testharness"
   ],
   "webrtc/RTCDtlsTransport-state.html": [
-   "fd7215fa4e162acaed2af563c83b5b0846af3dd5",
+   "60a14b151e18940a15f91143641f360ef0da346e",
    "testharness"
   ],
   "webrtc/RTCError.html": [
@@ -504075,7 +504132,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-helper.js": [
-   "efbb1a23c88b2a5f524391cbe66c8495624ceaa3",
+   "5426e5810738d74724f13b2044f5cce7e5e720cd",
    "support"
   ],
   "webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html": [
@@ -504087,7 +504144,7 @@
    "support"
   ],
   "webrtc/RTCPeerConnection-iceConnectionState.https.html": [
-   "1bb07935cc70b767fda1872f4495f0655b6a44c7",
+   "4a7f137fd6a3a4f96b74526b14ff3f40f2d3852d",
    "testharness"
   ],
   "webrtc/RTCPeerConnection-iceGatheringState-expected.txt": [
@@ -504346,12 +504403,8 @@
    "e76bc1fbb7740f7a575f0acba397284aa5d5db94",
    "testharness"
   ],
-  "webrtc/RTCRtpTransceiver-setCodecPreferences-expected.txt": [
-   "a13c414228db975584d1897eb718415238008d77",
-   "support"
-  ],
   "webrtc/RTCRtpTransceiver-setCodecPreferences.html": [
-   "a1f7854e1a2f18036040f882889ff6758e9968c0",
+   "c553c9d8bc79640c23ec803552f973012a801bb5",
    "testharness"
   ],
   "webrtc/RTCRtpTransceiver-stop-expected.txt": [
@@ -504439,7 +504492,7 @@
    "testharness"
   ],
   "webrtc/idlharness.https.window-expected.txt": [
-   "3b456b5366ccad7e9eb445484cdaa009fad2b452",
+   "a3925995a7df467d58adc6fc608fcb777ca1bc35",
    "support"
   ],
   "webrtc/idlharness.https.window.js": [
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html
index 6165886..3020256 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html
@@ -20,6 +20,6 @@
        onload='t1.done();'
        onerror='t1.unreached_func("The image should have loaded");'>
 
-  <script async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=img-src%20%27none%27'></script>
+  <script async defer src='../support/checkReport.sub.js?reportField=effectiveDirective&reportValue=img-src%20%27none%27'></script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html
index 6ec11ef..23337ae 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-sends-reports-on-violation.https.sub.html
@@ -50,6 +50,6 @@
        onload='t1.unreached_func("The image should not have loaded");'
        onerror='t1.done();'>
 
-  <script async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=img-src%20%27none%27'></script>
+  <script async defer src='../support/checkReport.sub.js?reportField=effectiveDirective&reportValue=img-src%20%27none%27'></script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-works-on-frame-src.https.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-works-on-frame-src.https.sub.html
index d633e3b..b83a05ce 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-works-on-frame-src.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/reporting-api/reporting-api-works-on-frame-src.https.sub.html
@@ -17,6 +17,6 @@
   </script>
   <iframe src="../support/fail.html"></iframe>
 
-  <script async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=frame-src%20%27none%27'></script>
+  <script async defer src='../support/checkReport.sub.js?reportField=effectiveDirective&reportValue=frame-src%20%27none%27'></script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/inheritance.html b/third_party/blink/web_tests/external/wpt/css/css-color/inheritance.html
new file mode 100644
index 0000000..2928bfa3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/inheritance.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Color properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-color/#property-index">
+<meta name="assert" content="Properties inherit or not according to the spec.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+assert_inherited('color', 'rgb(0, 0, 0)', 'rgb(42, 53, 64)');
+assert_not_inherited('opacity', '1', '0.5');
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed.html
new file mode 100644
index 0000000..e339a0ca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Color Module Level 3: getComputedValue().color</title>
+<link rel="help" href="https://drafts.csswg.org/css-color/#propdef-color">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+  <div id="target"></div>
+</div>
+<style>
+  #container {
+    color: rgb(255, 0, 0);
+  }
+</style>
+<script>
+test_computed_value("color", "currentcolor", "rgb(255, 0, 0)");
+test_computed_value("color", "transparent", "rgba(0, 0, 0, 0)");
+test_computed_value("color", "red", "rgb(255, 0, 0)");
+test_computed_value("color", "magenta", "rgb(255, 0, 255)");
+test_computed_value("color", "#234", "rgb(34, 51, 68)");
+test_computed_value("color", "#FEDCBA", "rgb(254, 220, 186)");
+test_computed_value("color", "rgb(2, 3, 4)");
+test_computed_value("color", "rgb(100%, 0%, 0%)", "rgb(255, 0, 0)");
+test_computed_value("color", "rgba(2, 3, 4, 0.5)");
+test_computed_value("color", "hsl(120, 100%, 50%)", "rgb(0, 255, 0)");
+test_computed_value("color", "hsla(120, 100%, 50%, 0.25)", "rgba(0, 255, 0, 0.25)");
+test_computed_value("color", "rgb(-2, 3, 4)", "rgb(0, 3, 4)");
+test_computed_value("color", "rgb(100, 200, 300)", "rgb(100, 200, 255)");
+test_computed_value("color", "rgb(20, 10, 0, -10)", "rgba(20, 10, 0, 0)");
+test_computed_value("color", "rgb(100%, 200%, 300%)", "rgb(255, 255, 255)");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/opacity-computed.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/opacity-computed.html
new file mode 100644
index 0000000..32250b3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/opacity-computed.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: getComputedValue().opacity</title>
+<link rel="help" href="https://www.w3.org/TR/css-color-3/#opacity">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("opacity", "1");
+test_computed_value("opacity", "0.5");
+test_computed_value("opacity", "0");
+test_computed_value("opacity", "-2", "0");
+test_computed_value("opacity", "3", "1");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/inheritance.html b/third_party/blink/web_tests/external/wpt/css/css-images/inheritance.html
new file mode 100644
index 0000000..5ca1ed6b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/inheritance.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Inheritance of CSS Images properties</title>
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#property-index">
+<meta name="assert" content="Properties inherit or not according to the spec.">
+<meta name="assert" content="Properties have initial values according to the spec.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/inheritance-testcommon.js"></script>
+</head>
+<body>
+<div id="container">
+<div id="target"></div>
+</div>
+<script>
+assert_inherited('image-orientation', '0deg', 'from-image'); // none is 0deg
+assert_inherited('image-rendering', 'auto', 'pixelated');
+assert_not_inherited('object-fit', 'fill', 'contain');
+assert_not_inherited('object-position', '50% 50%', '10px 20px');
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-computed.html b/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-computed.html
new file mode 100644
index 0000000..f95dcc05
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-computed.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3 Test: getComputedValue().objectPosition</title>
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-object-position">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("object-position", "10% center", "10% 50%");
+test_computed_value("object-position", "right 30% top 60px", "70% 60px");
+test_computed_value("object-position", "-20% -30px");
+test_computed_value("object-position", "30px center", "30px 50%");
+test_computed_value("object-position", "40px top", "40px 0%");
+test_computed_value("object-position", "right 20% bottom 10%", "80% 90%");
+test_computed_value("object-position", "right bottom", "100% 100%");
+test_computed_value("object-position", "center 50px", "50% 50px");
+test_computed_value("object-position", "center bottom", "50% 100%");
+test_computed_value("object-position", "left center", "0% 50%");
+test_computed_value("object-position", "left bottom", "0% 100%");
+test_computed_value("object-position", "right 40%", "100% 40%");
+test_computed_value("object-position", "center top", "50% 0%");
+test_computed_value("object-position", "center", "50% 50%");
+test_computed_value("object-position", "center center", "50% 50%");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-valid.html b/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-valid.html
index b9dab78b..90178c66 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-valid.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/parsing/object-position-valid.html
@@ -15,7 +15,7 @@
 // First serialization is being returned by Blink/Firefox/WebKit, second by Edge.
 test_valid_value("object-position", "10%", ["10% center", "10% 50%"]);
 test_valid_value("object-position", "right 30% top 60px"); // "calc(70%) 60px" in Edge.
-test_valid_value("object-position", "20% 30px");
+test_valid_value("object-position", "-20% -30px");
 test_valid_value("object-position", "30px center", ["30px center", "30px 50%"]);
 test_valid_value("object-position", "40px top", ["40px top", "40px 0%"]);
 test_valid_value("object-position", "bottom 10% right 20%", "right 20% bottom 10%"); // "calc(80%) calc(90%)" in Edge.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-change.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-change.html
new file mode 100644
index 0000000..89b4edaf1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-change.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type" />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+div, html, body {
+  margin: 0;
+  padding: 0;
+}
+html {
+  margin: 0px;
+  overflow: scroll;
+}
+#scroller {
+  margin-left: 200px;
+
+  height: 300px;
+  width: 300px;
+  overflow: scroll;
+}
+.space {
+  width: 2000px;
+  height: 2000px;
+}
+.snap_area {
+  margin-left: 200px;
+  top: 0;
+  width: 200px;
+  height: 200px;
+  background-color: blue;
+  scroll-snap-align: none start;
+}
+</style>
+
+<!-- Add snap area to the root scroller -->
+<div class="snap_area" id="viewport"></div>
+
+<div id="scroller">
+  <div class="snap_area" id="inner"></div>
+  <div class="space"></div>
+</div>
+
+<div class="space"></div>
+
+<script>
+
+const scrollers = [document.scrollingElement, document.getElementById("scroller")];
+for (const scroller of scrollers) {
+  test(_ => {
+    scroller.style.scrollSnapType = 'x mandatory';
+    scroller.scrollTo(100, 0);
+    assert_equals(scroller.scrollLeft, 200, "scrolling should snap");
+
+    // When snap type is 'none' the scroller, scrolling should not snap.
+    scroller.style.scrollSnapType = 'none';
+    scroller.scrollTo(100, 0);
+    assert_equals(scroller.scrollLeft, 100, "scrolling should not snap");
+
+    // When snap type is changed back to mandatory, scrolling should snap.
+    scroller.style.scrollSnapType = 'x mandatory';
+    scroller.scrollTo(110, 0);
+    assert_equals(scroller.scrollLeft, 200, "scrolling should snap after change");
+  }, `scroll-snap-type on ${scroller.nodeName} should control snapping behavior and changing it takes effect`);
+}
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type.html
similarity index 84%
rename from third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html
rename to third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type.html
index cfe990c..1577aa7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type-proximity.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-snap-type.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1" />
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type" />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
@@ -77,4 +77,11 @@
   assert_equals(scroller.scrollLeft, 1000);
   assert_equals(scroller.scrollTop, 1000);
 }, "proximity scroll-snap-type should snap if the snap position is close.");
+
+test(_ => {
+  scroller.style.scrollSnapType = "none";
+  scroller.scrollTo(100, 100);
+  assert_equals(scroller.scrollLeft, 100, "scrolling should not snap");
+  assert_equals(scroller.scrollTop, 100, "scrolling should not snap");
+}, "none scroll-snap-type shouldn't snap.");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html
new file mode 100644
index 0000000..05d78b2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-001.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: manual hyphenation and out-of-flow</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property">
+<meta name="flags" content="">
+<link rel="match" href="reference/hyphens-span-001-ref.html">
+<meta name="assert" content="the presence of an out of flow element has no effect on manual hyhenation">
+<style>
+span {
+  position: absolute;
+  color: transparent;
+}
+div {
+  border: solid orange;
+  margin: 5px;
+  width: 6ch;
+  hyphens: manual;
+}
+</style>
+
+<p>Test passes if the text in all orange boxes below is identical (including the presence and position of a hyphen).
+
+<div>high&shy;way</div>
+<div><span>abspos</span>high&shy;way</div>
+<div>h<span>abspos</span>igh&shy;way</div>
+<div>high<span>abspos</span>&shy;way</div>
+<div>high&shy;<span>abspos</span>way</div>
+<div>high&shy;wa<span>abspos</span>y</div>
+<div>high&shy;way<span>abspos</span></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html
new file mode 100644
index 0000000..0b88adae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphens-out-of-flow-002.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: auto hyphenation and out-of-flow</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#hyphens-property">
+<meta name="flags" content="">
+<link rel="match" href="reference/hyphens-span-002-ref.html">
+<meta name="assert" content="the presence of an out of flow element has no effect on automatic hyhenation">
+<style>
+span {
+  position: absolute;
+  color: transparent;
+}
+div {
+  border: solid orange;
+  margin: 5px;
+  width: 6ch;
+  hyphens: auto;
+}
+</style>
+
+<p>Test passes if the text in all orange boxes below is identical (including the presence and position of a hyphen).
+
+<div lang=en>highway</div>
+<div lang=en><span>abspos</span>highway</div>
+<div lang=en>h<span>abspos</span>ighway</div>
+<div lang=en>high<span>abspos</span>way</div>
+<div lang=en>high<span>abspos</span>way</div>
+<div lang=en>highwa<span>abspos</span>y</div>
+<div lang=en>highway<span>abspos</span></div>
+
+<!--
+This test assumes the presence of "highway"
+with a hyphenation point between "high" and "way"
+in the hyphenation dictionary for English
+in order to be useful,
+but that assumption is not necessary for the test to be correct:
+if the word doesn't hyphenate,
+it will not hyphenate in any of the cases.
+-->
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom-ref.html
new file mode 100644
index 0000000..5e43c7d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html style="zoom:5">
+<meta charset="utf-8">
+<title>backdrop-filter: Clip the filter at border box of element</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+
+<div>
+  <p>Expected: A green box, color-inverted inside the short, wide box with a<br>
+  blue border and rounded corners, and not color-inverted anywhere else. In<br>
+  particular, there should be no color inversion inside the tall, narrow box,<br>
+  or anywhere outside that.</p>
+</div>
+<div class="box"></div>
+<div class="navbar"></div>
+<div class="menu"></div>
+<div class="menu2"></div>
+
+<style>
+div {
+  position: absolute;
+}
+.box {
+  width: 200px;
+  height: 200px;
+  top: 100px;
+  left: 100px;
+  background: green;
+}
+.navbar {
+  width: 300px;
+  height: 50px;
+  top: 150px;
+  left: 50px;
+  border: 2px solid blue;
+  backdrop-filter: invert(1);
+  border-radius: 10px 20px 30px 40px;
+}
+.menu {
+  width: 100px;
+  height: 150px;
+  top: 202px;
+  left: 147px;
+  border: 2px solid red;
+}
+.menu2 {
+  width: 100px;
+  height: 30px;
+  top: 118px;
+  left: 147px;
+  border: 2px solid red;
+}
+</style>
+
+<script>
+  window.scrollTo(0,700);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom.html
new file mode 100644
index 0000000..36f0b1b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clip-rect-zoom.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html style="zoom:5">
+<meta charset="utf-8">
+<title>backdrop-filter: Clip the filter at border box of element</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match"  href="backdrop-filter-clip-rect-zoom-ref.html">
+
+<div>
+  <p>Expected: A green box, color-inverted inside the short, wide box with a<br>
+  blue border and rounded corners, and not color-inverted anywhere else. In<br>
+  particular, there should be no color inversion inside the tall, narrow box,<br>
+  or anywhere outside that.</p>
+</div>
+<div class="box"></div>
+<div class="navbar">
+  <div class="menu"></div>
+  <div class="menu2"></div>
+</div>
+<style>
+div {
+  position: absolute;
+}
+.box {
+  width: 200px;
+  height: 200px;
+  top: 100px;
+  left: 100px;
+  background: green;
+}
+.navbar {
+  width: 300px;
+  height: 50px;
+  top: 150px;
+  left: 50px;
+  border: 2px solid blue;
+  backdrop-filter: invert(1);
+  border-radius: 10px 20px 30px 40px;
+}
+.menu {
+  width: 100px;
+  height: 150px;
+  top: 50px;
+  left: 95px;
+  border: 2px solid red;
+}
+.menu2 {
+  width: 100px;
+  height: 30px;
+  top: -34px;
+  left: 95px;
+  border: 2px solid red;
+}
+</style>
+
+<script>
+  window.scrollTo(0,700);
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-stability/buffer-layout-jank.html b/third_party/blink/web_tests/external/wpt/layout-stability/buffer-layout-jank.html
index f5818cfb..5700959 100644
--- a/third_party/blink/web_tests/external/wpt/layout-stability/buffer-layout-jank.html
+++ b/third_party/blink/web_tests/external/wpt/layout-stability/buffer-layout-jank.html
@@ -12,6 +12,7 @@
 <img src="resources/slow-image.py">
 <script>
   async_test(function (t) {
+    const startTime = performance.now();
     // Modify the position of the div.
     document.getElementById('myDiv').style = "top: 60px";
     function testBufferedEntry() {
@@ -19,13 +20,15 @@
         t.step_timeout(testBufferedEntry, 0);
         return;
       }
+      const endTime = performance.now();
       assert_equals(performance.getEntriesByType('layoutJank').length, 1);
       assert_equals(performance.getEntries().filter(
         entry => entry.entryType === 'layoutJank').length, 1);
       const entry = performance.getEntriesByType('layoutJank')[0];
       assert_equals(entry.entryType, "layoutJank");
       assert_equals(entry.name, "");
-      assert_equals(entry.startTime, 0.0);
+      assert_greater_than_equal(entry.startTime, startTime)
+      assert_less_than_equal(entry.startTime, endTime)
       assert_equals(entry.duration, 0.0);
       // The layout jank fraction should be: 300 * (100 + 60) / viewport size.
       assert_equals(entry.fraction, 300 * (100 + 60) /
diff --git a/third_party/blink/web_tests/external/wpt/layout-stability/observe-layoutjank.html b/third_party/blink/web_tests/external/wpt/layout-stability/observe-layoutjank.html
index 1a0533ac..9d0f71c 100644
--- a/third_party/blink/web_tests/external/wpt/layout-stability/observe-layoutjank.html
+++ b/third_party/blink/web_tests/external/wpt/layout-stability/observe-layoutjank.html
@@ -10,13 +10,16 @@
 <script src="/resources/testharnessreport.js"></script>
 <script>
   async_test(function (t) {
+    const startTime = performance.now();
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
+        const endTime = performance.now();
         assert_equals(entryList.getEntries().length, 1);
         const entry = entryList.getEntries()[0];
         assert_equals(entry.entryType, "layoutJank");
         assert_equals(entry.name, "");
-        assert_equals(entry.startTime, 0.0);
+        assert_greater_than_equal(entry.startTime, startTime)
+        assert_less_than_equal(entry.startTime, endTime)
         assert_equals(entry.duration, 0.0);
         // The layout jank fraction should be: 300 * (100 + 60) / viewport size.
         assert_equals(entry.fraction, 300 * (100 + 60) /
diff --git a/third_party/blink/web_tests/external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html b/third_party/blink/web_tests/external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html
new file mode 100644
index 0000000..f340ba8b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/speech-api/SpeechSynthesisUtterance-volume-manual.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>5.2.3 SpeechSynthesisUtterance volume attribute test - Manual</title>
+  <style>
+    div,
+    #test {
+      display: block;
+      width: 640px;
+      word-break: break-all;
+      padding: 4px;
+    }
+    #test,
+    #volume {
+      background: skyblue;
+      font-weight: bold;
+    }
+  </style>
+  <script>
+    const text = "hello universe";
+    const volumes = [0, 0.2, 0.4, 0.6, 1];
+
+    handleVoicesChanged = async _ => {
+      for (const volume of volumes) {
+        await new Promise(resolve => {
+          document.getElementById("volume").value = volume;
+          const utterance = new SpeechSynthesisUtterance();
+          utterance.text = "hello universe";
+          utterance.volume = volume;
+          utterance.onend = resolve;
+          window.speechSynthesis.speak(utterance);
+        });
+      };
+    };
+    onload = e => {
+      document.getElementById("test").onclick = _ => {
+        if (window.speechSynthesis.getVoices().length === 0) {
+          window.speechSynthesis.onvoiceschanged = handleVoicesChanged;
+        } else {
+          handleVoicesChanged()
+        }
+      };
+    };
+  </script>
+</head>
+<body>
+  <div>
+    <h3>Specification:</h3>
+    <a href="https://w3c.github.io/speech-api/speechapi.html#utterance-attributes"><b><code><i><u>volume</u></i></code> attribute</b></a>
+    <blockquote>
+      This attribute specifies the speaking volume for the utterance. It ranges between 0 and 1 inclusive, with 0 being the lowest volume and 1 the highest volume, with a default of 1. If SSML is used, this value will be overridden by prosody tags in the markup.
+    </blockquote>
+  </div>
+  <div id="test">
+    Click to execute <code>window.speechSynthesis.speak()</code> with <code>volume attribute</code> set to <code>0, 0.2, 0.4, 0.6, 1.</code>
+  </div>
+  <br>
+  <div>
+    <label for="volume">Current volume: </label>
+    <input id="volume" readonly>
+    <h3>Manaul Test:</h3>Does the volume of audio output change?
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/svg/pservers/inheritance.svg b/third_party/blink/web_tests/external/wpt/svg/pservers/inheritance.svg
new file mode 100644
index 0000000..e08b93d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/pservers/inheritance.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:h="http://www.w3.org/1999/xhtml"
+     width="800px" height="8000px">
+  <title>Inheritance of SVG paint server properties</title>
+  <metadata>
+    <h:link rel="help" href="https://svgwg.org/svg2-draft/pservers.html"/>
+    <h:meta name="assert" content="properties inherit according to the spec."/>
+    <h:meta name="assert" content="properties have expected initial values."/>
+  </metadata>
+  <g id="container">
+      <g id="target"></g>
+  </g>
+  <h:script src="/resources/testharness.js"/>
+  <h:script src="/resources/testharnessreport.js"/>
+  <h:script src="/css/support/inheritance-testcommon.js"/>
+  <script><![CDATA[
+assert_not_inherited('stop-color', 'rgb(0, 0, 0)', 'rgb(42, 53, 64)');
+assert_not_inherited('stop-opacity', '1', '0.5');
+  ]]></script>
+</svg>
diff --git a/third_party/blink/web_tests/fast/dom/52776.html b/third_party/blink/web_tests/fast/dom/52776.html
index 3e4c894..24819740 100644
--- a/third_party/blink/web_tests/fast/dom/52776.html
+++ b/third_party/blink/web_tests/fast/dom/52776.html
@@ -110,9 +110,7 @@
             
     var test = document.getElementById('test');
     var sel = getSelection();
-    sel.collapse(test,0);
-    sel.modify("move", "right", "lineBoundary");
-    sel.modify("move", "left", "character");
+    sel.collapse(test.firstChild, 3);
     sel.modify("extend", "left", "character");
     assertEqual("test id=test: the right-most character of rendering result of <PDF>abc<PDF> in RTL block should be c", sel.toString(), 'c');
 </script> 
diff --git a/third_party/blink/web_tests/fast/text/selection/atsui-bidi-control-expected.txt b/third_party/blink/web_tests/fast/text/selection/atsui-bidi-control-expected.txt
index 9edf548..3c9ce136 100644
--- a/third_party/blink/web_tests/fast/text/selection/atsui-bidi-control-expected.txt
+++ b/third_party/blink/web_tests/fast/text/selection/atsui-bidi-control-expected.txt
@@ -3,9 +3,9 @@
 (1,1)
 (2,2)
 (3,3)
-(6,6)
-(5,5)
 (4,4)
+(5,5)
+(6,6)
 (7,7)
 (8,8)
 (9,9)
diff --git a/third_party/blink/web_tests/xr/xrSession_deviceDisconnect.html b/third_party/blink/web_tests/xr/xrSession_deviceDisconnect.html
new file mode 100644
index 0000000..6f2a586
--- /dev/null
+++ b/third_party/blink/web_tests/xr/xrSession_deviceDisconnect.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
+<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
+<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
+<script src="../xr/resources/xr-internal-device-mocking.js"></script>
+<script src="../xr/resources/xr-test-utils.js"></script>
+<script src="../xr/resources/test-constants.js"></script>
+<canvas id="webgl-canvas"></canvas>
+
+<script>
+
+let testName = "Outstanding promises resolve appropriately if device disconencts";
+
+// Expose the ability to get get the VRService and close the device on that VRService.
+ChromeXRTest.prototype.getService = function() {
+  return this.mockVRService_;
+}
+
+MockVRService.prototype.closeDevice = function() {
+  this.deviceBinding_.close();
+  this.devicePtr_ = null;
+}
+
+// Override the default implementations of requestSession and supportsSession
+// from XRDevice so that we can choose to either return an answer immediately or
+// return a promise that will never resolve to guarantee we have an outstanding
+// promise on device disconnect.
+MockVRService.prototype.requestSession = function(sessionOptions, was_activation) {
+  return new Promise((resolve,reject) => { });
+}
+
+let immediatelyResolveSupportsSession = true;
+MockVRService.prototype.supportsSession = function(sessionOptions) {
+  if (immediatelyResolveSupportsSession) {
+    return Promise.resolve({ supportsSession: true });
+  }
+
+  return new Promise((resolve, reject) => { });
+}
+
+// Override the default requestDevice implementation so that we can fail if it's
+// called when we don't expect it to be called (typically this would be because
+// we aren't planning to force another device closure and would leave any
+// outstanding promises unresolved, and thus cause the test to timeout), and so
+// that we can store the device binding so that we can force it to be closed.
+let failIfRequestDeviceCalled = false;
+MockVRService.prototype.requestDevice = function() {
+  if (failIfRequestDeviceCalled) {
+    assert_unreached("requestDevice shouldn't be called at this time");
+  }
+
+  if (!this.devicePtr_) {
+    this.devicePtr_ = new device.mojom.XRDevicePtr();
+    this.deviceBinding_ = new mojo.Binding(
+        device.mojom.XRDevice, this, mojo.makeRequest(this.devicePtr_));
+  }
+
+  return Promise.resolve({device: this.devicePtr_});
+}
+
+// Convenience methods to turn a resolve/reject into an appropraite string
+// which Promise.All can check to tell us which methods failed.
+// If we just let the promises assert, then Promise.all would only fail on the
+// first assert.
+let successMessage = "PASS";
+let failMessageStart = "FAIL: "
+function WrapResolve(promise, name, errorMsg) {
+  return promise.then(() => {
+    return successMessage;
+  }, () => {
+    return failMessageStart + name + ": " + errorMsg;
+  });
+}
+
+function WrapReject(promise, name, errorMsg, errorType) {
+  return promise.then(() => {
+    return failMessageStart + name + ": " + errorMsg;
+  }, (err) => {
+    if (err.name === errorType) {
+      return successMessage;
+    }
+
+    return failMessageStart + name + ": expected: " + errorType + " but got: " + err.name;
+  });
+}
+
+// Per security requirements, requesting an immersive session requires a user gesture.
+function requestImmersiveSession() {
+  return new Promise((resolve, reject) => {
+    runWithUserGesture(() => {
+      navigator.xr.requestSession('immersive-vr').then((session) => {
+        resolve(session);
+      }, (err) => {
+        reject(err);
+      });
+    });
+  });
+}
+
+let validateDeviceDisconnectPromise = function() {
+  // Ensure that the state is properly set-up for our helper functions so that
+  // we can be called multiple times.
+  failIfRequestDeviceCalled = false;
+  immediatelyResolveSupportsSession = true;
+
+  // Make a supports session call so that we can ensure that the underlying code
+  // has gotten a devicePtr set up.  Note that inline, since it's always
+  // guaranteed doesn't ensure that the device is set up, where-as a call to see
+  // if we support immersive does require a device
+  return navigator.xr.supportsSession('immersive-vr').then(() => {
+
+    // Cause supportsSession to stop returning and make future calls "hang"/
+    immediatelyResolveSupportsSession = false;
+
+    // We don't expect a new device to be requested, and if it is we aren't
+    // going to close it during this test, so any of our mocked calls will cause
+    //  a timeout.
+    failIfRequestDeviceCalled = true;
+    let promises = [];
+
+    // Note that inline session requests still call out through the device.
+    promises.push(WrapResolve(navigator.xr.requestSession('inline'), "Request Inline",
+      "Inline should always be available"));
+    promises.push(WrapReject(requestImmersiveSession(), "Request Immersive",
+      "Immersive should be rejected once device is disconnected", "NotSupportedError"));
+    promises.push(WrapReject(navigator.xr.supportsSession('immersive-vr'), "Supports Immersive",
+      "Immersive should not be supported once device is disconnected", "NotSupportedError"));
+
+    // Force the device disconnect, which should cause the promises to resolve.
+    XRTest.getService().closeDevice();
+
+    // Call this after we close the device, because we don't expect this to rely
+    // on (or request) the presence of a device.
+    promises.push(WrapResolve(navigator.xr.supportsSession('inline'), "Supports Inline",
+      "Inline support should be available without calling to a device"));
+
+    return Promise.all(promises).then((results) => {
+      let error_messages = [];
+      for (let i = 0; i < results.length; i++) {
+        if (results[i] !== successMessage) {
+          error_messages.push(results[i]);
+        }
+      }
+
+      if (error_messages.length !== 0) {
+        assert_unreached(error_messages);
+      }
+    })
+  });
+}
+
+let testFunction = function(t) {
+  return validateDeviceDisconnectPromise().then(() => {
+
+    // Validate that even after disconnecting and resolving the promises,
+    // we can still request a new device, and that it will resolve any promises
+    // on it's disconnect.
+    return validateDeviceDisconnectPromise();
+  })
+}
+
+promise_test(testFunction, testName);
+
+</script>
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 3a06d79..705a620 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -839,8 +839,29 @@
 </action>
 
 <action name="Accel_Restore_Tab">
-  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
-  <description>Please enter the description of this user action.</description>
+  <owner>mpearson@chromium.org</owner>
+  <owner>chrisha@chromium.org</owner>
+  <description>
+    Emitted when the Ash window manager hotkey handler handles the
+    &quot;Ctrl-Shift-T&quot; shortcut that causes the most recently closed tab
+    to be restored. Because it's related to Ash, it's ChromeOS only. This is
+    only emitted when the Ash hotkey handler handles the shortcut, which only
+    happens when a non-Chrome window is focussed on ChromeOS. (The launcher is
+    an example of a non-Chrome window.) If a Chrome window was focussed on
+    ChromeOS as the user presses the keyboard shortcut, it's handled by Chrome's
+    keyboard shortcut handler system. In that case, the user action RestoreTab
+    is emitted, not Accel_Restore_Tab.
+
+    It's never the case that both Accel_Restore_Tab and RestoreTab are emitted
+    for the same keyboard shortcut press.
+
+    Note: if the last user action was to close an entire window with multiple
+    tabs, this keyboard shortcut will cause the entire window to be restored,
+    containing multiple tabs. This user action is only emitted once however,
+    regardless of the number of tabs.
+
+    This is not emitted during session restore that occurs as part of startup.
+  </description>
 </action>
 
 <action name="Accel_Rotate_Active_Window">
@@ -1323,6 +1344,13 @@
   </description>
 </action>
 
+<action name="AltClickMappedToRightClick">
+  <owner>zentaro@chromium.org</owner>
+  <description>
+    User pressed alt click on a touchpad device to generate right click.
+  </description>
+</action>
+
 <action name="Android.BookmarkPage.RemoveItem">
   <owner>huayinz@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
@@ -16632,8 +16660,27 @@
 </action>
 
 <action name="RestoreTab">
-  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
-  <description>Please enter the description of this user action.</description>
+  <owner>mpearson@chromium.org</owner>
+  <owner>chrisha@chromium.org</owner>
+  <description>
+    Emitted anytime the most recently closed tab is restored via
+    browser/ui/browser_tab_restorer.cc. This occurs either via the
+    (Ctrl-Shift-T) hotkey or the tab context menu. These are cases where the
+    user hasn't explicitly selected a recently closed tab; the user is asking
+    that the most recently closed tab be restored. Thus, it's not recorded, for
+    example, if the user uses three-dots menu &gt; History &gt; Recently Closed
+    Tabs and selects a tab, as in this case the user has selected a recently
+    closed tab explicitly. That case and cases like it go directly to
+    TabRestoreService::RestoreEntryById and bypass the browser_tab_restorer code
+    path.
+
+    Note: if the last user action was to close an entire window with multiple
+    tabs, this RestoreTab action will cause the entire window to be restored,
+    containing multiple tabs. This user action is only emitted once however,
+    regardless of the number of tabs.
+
+    This is not emitted during session restore that occurs as part of startup.
+  </description>
 </action>
 
 <action name="Save">
@@ -20393,8 +20440,18 @@
 </action>
 
 <action name="TabContextMenu_RestoreTab">
-  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
-  <description>Please enter the description of this user action.</description>
+  <owner>mpearson@chromium.org</owner>
+  <owner>chrisha@chromium.org</owner>
+  <description>
+    Emitted when the user uses the tab strip context menu and selects
+    &quot;Reopen Closed Tab&quot;. This interaction also causes the user action
+    RestoreTab to be emitted.
+
+    Note: if the last user action was to close an entire window with multiple
+    tabs, this &quot;Reopen Closed Tab&quot; action will cause the entire window
+    to be restored, containing multiple tabs. This user action is only emitted
+    once however, regardless of the number of tabs.
+  </description>
 </action>
 
 <action name="TabContextMenu_SendTabToSelf_Clicked">
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index fa16979..7c038c93 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -12337,6 +12337,11 @@
   <int value="33" label="Network panel film strip started recording"/>
 </enum>
 
+<enum name="DevToolsBackgroundService">
+  <int value="2" label="Background Fetch"/>
+  <int value="3" label="Background Sync"/>
+</enum>
+
 <enum name="DevToolsPanel">
   <int value="1" label="Elements"/>
   <int value="2" label="Resources"/>
@@ -34763,6 +34768,7 @@
       label="SyncPseudoUSSHistoryDeleteDirectives:disabled"/>
   <int value="1260186484" label="spurious-power-button-screen-accel"/>
   <int value="1261713150" label="ChromeHomeOptOutSnackbar:disabled"/>
+  <int value="1266156008" label="IdentityDisc:disabled"/>
   <int value="1266525177"
       label="AutofillUpstreamUseGooglePayOnAndroidBranding:disabled"/>
   <int value="1266886673" label="delay-reload-stop-button-change"/>
@@ -35117,6 +35123,7 @@
   <int value="1814671708" label="disable-password-manager-reauthentication"/>
   <int value="1816843861" label="ServiceWorkerServicification:enabled"/>
   <int value="1817312143" label="num-raster-threads"/>
+  <int value="1818829958" label="IdentityDisc:enabled"/>
   <int value="1819256299" label="disable-webrtc-hw-decoding"/>
   <int value="1819536169" label="disable-cast-streaming-hw-encoding"/>
   <int value="1820317896" label="NTPShowGoogleGInOmnibox:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 4db5b4a..390b4e59 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -24509,6 +24509,17 @@
   </summary>
 </histogram>
 
+<histogram name="DevTools.BackgroundService.StartRecording"
+    enum="DevToolsBackgroundService" expires_after="M78">
+  <owner>dgozman@chromium.org</owner>
+  <owner>rayankans@chromium.org</owner>
+  <summary>
+    Records the Background Service for which `Recording` mode was enabled. This
+    is called if the developer toggles the record button in the relevant
+    Bakground Service DevTools panel.
+  </summary>
+</histogram>
+
 <histogram name="DevTools.InspectElement" units="ms">
   <owner>alph@chromium.org</owner>
   <owner>pfeldman@chromium.org</owner>
@@ -97494,7 +97505,31 @@
   <owner>robertogden@chromium.org</owner>
   <summary>
     Whether or not an offline preview that was committed showed an error page.
-    This metric is recorded every time an offline preview is commited.
+    This metric is recorded every time an offline preview is committed.
+  </summary>
+</histogram>
+
+<histogram name="Previews.Offline.FalsePositivePrevention.Allowed"
+    enum="BooleanAllowed" expires_after="M80">
+  <owner>robertogden@chromium.org</owner>
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    Whether or not the navigated URL was allowed to trigger an offline preview.
+    This is done by checking an in-memory cache of all available offline
+    previews which is designed to prevent false positive triggering. This metric
+    is recorded on every preview eligible navigation when the
+    OfflinePreviewsFalsePositivePrevention feature is enabled.
+  </summary>
+</histogram>
+
+<histogram name="Previews.Offline.FalsePositivePrevention.PrefSize"
+    units="count of entries" expires_after="M80">
+  <owner>robertogden@chromium.org</owner>
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The number of entries in the false positive prevention pref. This is
+    recorded every time we update the pref from a DB query, at most once per
+    session.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 84c5a729..164a275 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -4563,13 +4563,6 @@
       meaningful input per navigation. See https://goo.gl/tr1oTZ for a detailed
       explanation. In ms.
     </summary>
-    <aggregation>
-      <history>
-        <statistics>
-          <quantiles type="std-percentiles"/>
-        </statistics>
-      </history>
-    </aggregation>
   </metric>
   <metric name="InteractiveTiming.FirstInputDelay2">
     <obsolete>
@@ -4582,14 +4575,6 @@
       meaningful input per navigation. See https://goo.gl/tr1oTZ for a detailed
       explanation. In ms.
     </summary>
-    <aggregation>
-      <history>
-        <index fields="profile.country"/>
-        <statistics>
-          <quantiles type="std-percentiles"/>
-        </statistics>
-      </history>
-    </aggregation>
   </metric>
   <metric name="InteractiveTiming.FirstInputDelay3">
     <summary>
@@ -4665,14 +4650,6 @@
       timestamp and the start of event processing on the main thread for the
       meaningful input per navigation. In ms.
     </summary>
-    <aggregation>
-      <history>
-        <index fields="profile.country"/>
-        <statistics>
-          <quantiles type="std-percentiles"/>
-        </statistics>
-      </history>
-    </aggregation>
   </metric>
   <metric name="InteractiveTiming.LongestInputDelay3">
     <summary>
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h
index abae4ffd..158eea2 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -177,6 +177,13 @@
   virtual std::set<AXPlatformNode*> GetReverseRelations(
       ax::mojom::IntListAttribute attr) = 0;
 
+  // Return the string representation of the unique ID assigned by the author,
+  // otherwise return an empty string. The author ID must be persistent across
+  // any instance of the application, regardless of locale. The author ID should
+  // be unique among sibling accessibility nodes and is best if unique across
+  // the application, however, not meeting this requirement is non-fatal.
+  virtual base::string16 GetAuthorUniqueId() const = 0;
+
   virtual const AXUniqueId& GetUniqueId() const = 0;
 
   // This method finds text boundaries in the text used for platform text APIs.
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
index 209aecc..323bbc25 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -329,6 +329,10 @@
   return std::set<AXPlatformNode*>();
 }
 
+base::string16 AXPlatformNodeDelegateBase::GetAuthorUniqueId() const {
+  return base::string16();
+}
+
 const AXUniqueId& AXPlatformNodeDelegateBase::GetUniqueId() const {
   static base::NoDestructor<AXUniqueId> dummy_unique_id;
   return *dummy_unique_id;
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h
index 0c6d9ec..4301cda 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate_base.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -130,6 +130,8 @@
   std::set<AXPlatformNode*> GetReverseRelations(
       ax::mojom::IntListAttribute attr) override;
 
+  base::string16 GetAuthorUniqueId() const override;
+
   const AXUniqueId& GetUniqueId() const override;
 
   base::Optional<int> FindTextBoundary(
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index b75b3127b..15bf6ae1 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -3654,9 +3654,9 @@
       break;
 
     case UIA_AutomationIdPropertyId:
-      result->vt = VT_BSTR;
-      result->bstrVal =
-          SysAllocString(base::NumberToString16(GetUniqueId()).c_str());
+      V_VT(result) = VT_BSTR;
+      V_BSTR(result) =
+          SysAllocString(GetDelegate()->GetAuthorUniqueId().c_str());
       break;
 
     case UIA_ClassNamePropertyId:
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 317ac69..d1e145f 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -666,6 +666,8 @@
       "test/cocoa_helper.mm",
       "test/menu_test_observer.h",
       "test/menu_test_observer.mm",
+      "test/ns_ax_tree_validator.h",
+      "test/ns_ax_tree_validator.mm",
       "test/nswindow_fullscreen_notification_waiter.h",
       "test/nswindow_fullscreen_notification_waiter.mm",
       "test/scoped_fake_full_keyboard_access.h",
diff --git a/ui/base/test/ns_ax_tree_validator.h b/ui/base/test/ns_ax_tree_validator.h
new file mode 100644
index 0000000..6cecee0
--- /dev/null
+++ b/ui/base/test/ns_ax_tree_validator.h
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_TEST_NS_AX_TREE_VALIDATOR_H_
+#define UI_BASE_TEST_NS_AX_TREE_VALIDATOR_H_
+
+#include "base/optional.h"
+
+@protocol NSAccessibility;
+
+namespace ui {
+
+struct NSAXTreeProblemDetails {
+  enum ProblemType {
+    // |node_a| (the child node) is not a child of |node_b| (its parent).
+    NSAX_NOT_CHILD_OF_PARENT,
+
+    // |node_a| (the child node) is a child of |node_b|, but |node_a|'s parent
+    // is |node_c| instead.
+    NSAX_CHILD_PARENT_NOT_THIS,
+
+    // |node_a| (a supplied root node) is non-nil but does not conform to
+    // NSAccessibility.
+    NSAX_NOT_NSACCESSIBILITY,
+
+    // |node_a| (the child node)'s parent |node_b| is non-nil but does not
+    // conform to NSAccessibility.
+    NSAX_PARENT_NOT_NSACCESSIBILITY,
+  };
+
+  NSAXTreeProblemDetails(ProblemType type, id node_a, id node_b, id node_c);
+
+  ProblemType type;
+  // These aren't id<NSAccessibility> because some kinds of problem are caused
+  // by them not conforming to NSAccessibility.
+  id node_a;
+  id node_b;
+  id node_c;
+
+  std::string ToString();
+};
+
+// Validates the accessibility tree rooted at |root|. If at least one problem is
+// found, returns an |AXTreeProblemDetails| as described above; if not, returns
+// base::nullopt.
+base::Optional<NSAXTreeProblemDetails> ValidateNSAXTree(
+    id<NSAccessibility> root,
+    size_t* nodes_visited);
+
+// Prints the accessibility tree rooted at |root|. This function is useful for
+// debugging failures of ValidateNSAXTree tests.
+void PrintNSAXTree(id<NSAccessibility> root);
+
+}  // ui
+
+#endif  // UI_BASE_TEST_NS_AX_TREE_VALIDATOR_H_
diff --git a/ui/base/test/ns_ax_tree_validator.mm b/ui/base/test/ns_ax_tree_validator.mm
new file mode 100644
index 0000000..f9312c2
--- /dev/null
+++ b/ui/base/test/ns_ax_tree_validator.mm
@@ -0,0 +1,103 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/test/ns_ax_tree_validator.h"
+
+#include <Cocoa/Cocoa.h>
+
+#include "base/strings/sys_string_conversions.h"
+
+namespace {
+
+id<NSAccessibility> ToNSAccessibility(id obj) {
+  return [obj conformsToProtocol:@protocol(NSAccessibility)] ? obj : nil;
+}
+
+void PrintNSAXTreeHelper(id<NSAccessibility> root, int depth) {
+  std::string desc;
+  for (int i = 0; i < depth; i++)
+    desc += "  ";
+  desc += base::SysNSStringToUTF8([NSString stringWithFormat:@"%@", root]);
+  LOG(INFO) << desc;
+  for (id child in root.accessibilityChildren)
+    PrintNSAXTreeHelper(child, depth + 1);
+}
+
+}
+
+namespace ui {
+
+NSAXTreeProblemDetails::NSAXTreeProblemDetails(ProblemType type,
+                                               id node_a,
+                                               id node_b,
+                                               id node_c)
+    : type(type), node_a(node_a), node_b(node_b), node_c(node_c) {}
+
+std::string NSAXTreeProblemDetails::ToString() {
+  NSString* s;
+  switch (type) {
+    case NSAX_NOT_CHILD_OF_PARENT:
+      s = [NSString
+          stringWithFormat:@"Node %@ isn't a child of %@", node_a, node_b];
+      break;
+    case NSAX_CHILD_PARENT_NOT_THIS:
+      s = [NSString stringWithFormat:@"Node %@'s child %@'s parent is %@",
+                                     node_a, node_b, node_c];
+      break;
+    case NSAX_NOT_NSACCESSIBILITY:
+      s = [NSString stringWithFormat:@"Node %@ does not conform to"
+                                      " to NSAccessibility",
+                                     node_a];
+      break;
+    case NSAX_PARENT_NOT_NSACCESSIBILITY:
+      s = [NSString stringWithFormat:@"Node %@'s parent %@ does not conform"
+                                      " to NSAccessibility",
+                                     node_a, node_b];
+      break;
+  }
+  return base::SysNSStringToUTF8(s);
+}
+
+base::Optional<NSAXTreeProblemDetails> ValidateNSAXTree(
+    id<NSAccessibility> root,
+    size_t* nodes_visited) {
+  if (!ToNSAccessibility(root)) {
+    return base::make_optional<NSAXTreeProblemDetails>(
+        NSAXTreeProblemDetails::NSAX_NOT_NSACCESSIBILITY, root, nil, nil);
+  }
+  (*nodes_visited)++;
+
+  if (root.accessibilityParent) {
+    id<NSAccessibility> parent = ToNSAccessibility(root.accessibilityParent);
+    if (!parent) {
+      return base::make_optional<NSAXTreeProblemDetails>(
+          NSAXTreeProblemDetails::NSAX_PARENT_NOT_NSACCESSIBILITY, root, parent,
+          nil);
+    }
+
+    NSArray<id<NSAccessibility>>* parent_children =
+        parent.accessibilityChildren;
+
+    if ([parent_children indexOfObjectIdenticalTo:root] == NSNotFound) {
+      return base::make_optional<NSAXTreeProblemDetails>(
+          NSAXTreeProblemDetails::NSAX_NOT_CHILD_OF_PARENT, root, parent, nil);
+    }
+  }
+
+  NSArray<id<NSAccessibility>>* children = root.accessibilityChildren;
+  for (id<NSAccessibility> child in children) {
+    base::Optional<NSAXTreeProblemDetails> details =
+        ValidateNSAXTree(child, nodes_visited);
+    if (details.has_value())
+      return details;
+  }
+
+  return base::nullopt;
+}
+
+void PrintNSAXTree(id<NSAccessibility> root) {
+  PrintNSAXTreeHelper(root, 0);
+}
+
+}  // namespace ui
diff --git a/ui/chromeos/events/event_rewriter_chromeos.cc b/ui/chromeos/events/event_rewriter_chromeos.cc
index 8d6740f26..9ec01ec 100644
--- a/ui/chromeos/events/event_rewriter_chromeos.cc
+++ b/ui/chromeos/events/event_rewriter_chromeos.cc
@@ -12,6 +12,7 @@
 #include "base/command_line.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
+#include "base/metrics/user_metrics.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -1261,10 +1262,12 @@
       IsFromTouchpadDevice(mouse_event)) {
     *flags &= ~kAltLeftButton;
     *flags |= ui::EF_RIGHT_MOUSE_BUTTON;
-    if (mouse_event.type() == ui::ET_MOUSE_PRESSED)
+    if (mouse_event.type() == ui::ET_MOUSE_PRESSED) {
       pressed_device_ids_.insert(mouse_event.source_device_id());
-    else
+      base::RecordAction(base::UserMetricsAction("AltClickMappedToRightClick"));
+    } else {
       pressed_device_ids_.erase(mouse_event.source_device_id());
+    }
     return ui::EF_RIGHT_MOUSE_BUTTON;
   }
   return ui::EF_NONE;
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 61b732ba..91fdb5f0 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -620,7 +620,6 @@
       "accessibility/accessibility_alert_window.h",
       "accessibility/ax_aura_obj_cache.h",
       "accessibility/ax_aura_obj_wrapper.h",
-      "accessibility/ax_aura_window_utils.h",
       "accessibility/ax_root_obj_wrapper.h",
       "accessibility/ax_tree_source_views.h",
       "accessibility/ax_view_obj_wrapper.h",
@@ -657,7 +656,6 @@
       "accessibility/accessibility_alert_window.cc",
       "accessibility/ax_aura_obj_cache.cc",
       "accessibility/ax_aura_obj_wrapper.cc",
-      "accessibility/ax_aura_window_utils.cc",
       "accessibility/ax_root_obj_wrapper.cc",
       "accessibility/ax_tree_source_views.cc",
       "accessibility/ax_view_obj_wrapper.cc",
@@ -1202,7 +1200,6 @@
   if (use_aura) {
     sources += [
       "accessibility/ax_aura_obj_cache_unittest.cc",
-      "accessibility/ax_aura_window_utils_unittest.cc",
       "accessibility/ax_tree_source_views_unittest.cc",
       "controls/native/native_view_host_aura_unittest.cc",
       "corewm/tooltip_controller_unittest.cc",
diff --git a/ui/views/accessibility/ax_aura_obj_cache.cc b/ui/views/accessibility/ax_aura_obj_cache.cc
index 9a9131b..fe2916a 100644
--- a/ui/views/accessibility/ax_aura_obj_cache.cc
+++ b/ui/views/accessibility/ax_aura_obj_cache.cc
@@ -10,7 +10,6 @@
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/window.h"
 #include "ui/views/accessibility/ax_aura_obj_wrapper.h"
-#include "ui/views/accessibility/ax_aura_window_utils.h"
 #include "ui/views/accessibility/ax_view_obj_wrapper.h"
 #include "ui/views/accessibility/ax_widget_obj_wrapper.h"
 #include "ui/views/accessibility/ax_window_obj_wrapper.h"
@@ -144,15 +143,13 @@
     if (!focused_window)
       return nullptr;
 
-    // SingleProcessMash may need to jump between ash and client windows.
-    AXAuraWindowUtils* window_utils = AXAuraWindowUtils::Get();
-    focused_widget = window_utils->GetWidgetForNativeView(focused_window);
+    focused_widget = Widget::GetWidgetForNativeView(focused_window);
     while (!focused_widget) {
       focused_window = focused_window->parent();
       if (!focused_window)
         break;
 
-      focused_widget = window_utils->GetWidgetForNativeView(focused_window);
+      focused_widget = Widget::GetWidgetForNativeView(focused_window);
     }
   }
 
diff --git a/ui/views/accessibility/ax_aura_obj_cache_unittest.cc b/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
index a301131..54a4aff 100644
--- a/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
+++ b/ui/views/accessibility/ax_aura_obj_cache_unittest.cc
@@ -3,11 +3,22 @@
 // found in the LICENSE file.
 
 #include "ui/views/accessibility/ax_aura_obj_cache.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_serializer.h"
+#include "ui/accessibility/ax_tree_source_checker.h"
+#include "ui/aura/window.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/accessibility/ax_tree_source_views.h"
+#include "ui/views/controls/button/label_button.h"
 #include "ui/views/test/widget_test.h"
 
 namespace views {
 namespace test {
-
 namespace {
 
 // This class can be used as a deleter for std::unique_ptr<Widget>
@@ -17,6 +28,19 @@
 };
 
 using WidgetAutoclosePtr = std::unique_ptr<Widget, WidgetCloser>;
+
+bool HasNodeWithName(ui::AXNode* node, const std::string& name) {
+  if (node->GetStringAttribute(ax::mojom::StringAttribute::kName) == name)
+    return true;
+  for (auto* child : node->children()) {
+    if (HasNodeWithName(child, name))
+      return true;
+  }
+  return false;
+}
+
+bool HasNodeWithName(const ui::AXTree& tree, const std::string& name) {
+  return HasNodeWithName(tree.root(), name);
 }
 
 class AXAuraObjCacheTest : public WidgetTest {
@@ -57,5 +81,53 @@
   delete parent;
 }
 
+TEST_F(AXAuraObjCacheTest, ValidTree) {
+  // Create a parent window.
+  auto parent_widget = std::make_unique<Widget>();
+  Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+  params.bounds = gfx::Rect(0, 0, 200, 200);
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  parent_widget->Init(params);
+  parent_widget->GetNativeWindow()->SetTitle(
+      base::ASCIIToUTF16("ParentWindow"));
+  parent_widget->Show();
+
+  // Create a child window.
+  Widget* child_widget = new Widget();  // Owned by parent_widget.
+  params = CreateParams(Widget::InitParams::TYPE_BUBBLE);
+  params.parent = parent_widget->GetNativeWindow();
+  params.child = true;
+  params.bounds = gfx::Rect(100, 100, 200, 200);
+  params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET;
+  child_widget->Init(params);
+  child_widget->GetNativeWindow()->SetTitle(base::ASCIIToUTF16("ChildWindow"));
+  child_widget->Show();
+
+  // Create a child view.
+  auto* button = new LabelButton(nullptr, base::ASCIIToUTF16("ChildButton"));
+  button->SetSize(gfx::Size(20, 20));
+  child_widget->GetContentsView()->AddChildView(button);
+
+  // Use AXAuraObjCache to serialize the node tree.
+  AXAuraObjCache cache;
+  ui::AXTreeID tree_id = ui::AXTreeID::CreateNewAXTreeID();
+  AXTreeSourceViews tree_source(
+      cache.GetOrCreate(parent_widget->GetNativeWindow()), tree_id, &cache);
+  ui::AXTreeSerializer<AXAuraObjWrapper*, ui::AXNodeData, ui::AXTreeData>
+      serializer(&tree_source);
+  ui::AXTreeUpdate serialized_tree;
+  serializer.SerializeChanges(tree_source.GetRoot(), &serialized_tree);
+
+  // Verify tree is valid.
+  ui::AXTreeSourceChecker<AXAuraObjWrapper*, ui::AXNodeData, ui::AXTreeData>
+      checker(&tree_source);
+  EXPECT_TRUE(checker.Check());
+  ui::AXTree ax_tree(serialized_tree);
+  EXPECT_TRUE(HasNodeWithName(ax_tree, "ParentWindow"));
+  EXPECT_TRUE(HasNodeWithName(ax_tree, "ChildWindow"));
+  EXPECT_TRUE(HasNodeWithName(ax_tree, "ChildButton"));
+}
+
+}  // namespace
 }  // namespace test
 }  // namespace views
diff --git a/ui/views/accessibility/ax_aura_window_utils.cc b/ui/views/accessibility/ax_aura_window_utils.cc
deleted file mode 100644
index 9460788..0000000
--- a/ui/views/accessibility/ax_aura_window_utils.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/accessibility/ax_aura_window_utils.h"
-
-#include "ui/views/widget/widget.h"
-
-namespace views {
-
-namespace {
-AXAuraWindowUtils* g_instance = nullptr;
-}
-
-AXAuraWindowUtils::~AXAuraWindowUtils() = default;
-
-// static
-AXAuraWindowUtils* AXAuraWindowUtils::Get() {
-  if (!g_instance)
-    g_instance = new AXAuraWindowUtils();
-  return g_instance;
-}
-
-// static
-void AXAuraWindowUtils::Set(std::unique_ptr<AXAuraWindowUtils> new_instance) {
-  if (g_instance)
-    delete g_instance;
-  g_instance = new_instance.release();
-}
-
-aura::Window* AXAuraWindowUtils::GetParent(aura::Window* window) {
-  return window->parent();
-}
-
-aura::Window::Windows AXAuraWindowUtils::GetChildren(aura::Window* window) {
-  return window->children();
-}
-
-bool AXAuraWindowUtils::IsRootWindow(aura::Window* window) const {
-  return window->IsRootWindow();
-}
-
-views::Widget* AXAuraWindowUtils::GetWidgetForNativeView(aura::Window* window) {
-  return Widget::GetWidgetForNativeView(window);
-}
-
-AXAuraWindowUtils::AXAuraWindowUtils() = default;
-
-}  // namespace views
diff --git a/ui/views/accessibility/ax_aura_window_utils.h b/ui/views/accessibility/ax_aura_window_utils.h
deleted file mode 100644
index cd160f1..0000000
--- a/ui/views/accessibility/ax_aura_window_utils.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_VIEWS_ACCESSIBILITY_AX_AURA_WINDOW_UTILS_H_
-#define UI_VIEWS_ACCESSIBILITY_AX_AURA_WINDOW_UTILS_H_
-
-#include "ui/aura/window.h"
-#include "ui/views/views_export.h"
-
-namespace views {
-class Widget;
-
-// Singleton class that provides functions for walking a tree of aura::Windows
-// for accessibility. in particular, for --single-process-mash we want the
-// accessibility tree to jump from a proxy aura Window on the ash side direclty
-// to its corresponding client window. This is just a temporary solution to
-// that issue and should be removed once Mash is fully launched.
-// crbug.com/911945
-// TODO(jamescook): Delete this.
-class VIEWS_EXPORT AXAuraWindowUtils {
- public:
-  virtual ~AXAuraWindowUtils();
-
-  static AXAuraWindowUtils* Get();
-
-  // Replace this global instance with a subclass.
-  static void Set(std::unique_ptr<AXAuraWindowUtils> new_instance);
-
-  virtual aura::Window* GetParent(aura::Window* window);
-  virtual aura::Window::Windows GetChildren(aura::Window* window);
-  virtual bool IsRootWindow(aura::Window* window) const;
-  virtual views::Widget* GetWidgetForNativeView(aura::Window* window);
-
- protected:
-  AXAuraWindowUtils();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AXAuraWindowUtils);
-};
-
-}  // namespace views
-
-#endif  // UI_VIEWS_ACCESSIBILITY_AX_AURA_WINDOW_UTILS_H_
diff --git a/ui/views/accessibility/ax_aura_window_utils_unittest.cc b/ui/views/accessibility/ax_aura_window_utils_unittest.cc
deleted file mode 100644
index 06970e20..0000000
--- a/ui/views/accessibility/ax_aura_window_utils_unittest.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/accessibility/ax_aura_window_utils.h"
-
-#include "base/strings/utf_string_conversions.h"
-#include "ui/accessibility/ax_enums.mojom.h"
-#include "ui/accessibility/ax_node_data.h"
-#include "ui/accessibility/ax_tree.h"
-#include "ui/accessibility/ax_tree_id.h"
-#include "ui/accessibility/ax_tree_serializer.h"
-#include "ui/accessibility/ax_tree_source_checker.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/views/accessibility/ax_aura_obj_cache.h"
-#include "ui/views/accessibility/ax_tree_source_views.h"
-#include "ui/views/controls/button/label_button.h"
-#include "ui/views/test/views_test_base.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-
-namespace views {
-namespace {
-
-bool HasNodeWithName(ui::AXNode* node, const std::string& name) {
-  if (node->GetStringAttribute(ax::mojom::StringAttribute::kName) == name)
-    return true;
-  for (auto* child : node->children()) {
-    if (HasNodeWithName(child, name))
-      return true;
-  }
-  return false;
-}
-
-bool HasNodeWithName(ui::AXTree* tree, const std::string& name) {
-  return HasNodeWithName(tree->root(), name);
-}
-
-// Subclass of AXAuraWindowUtils that skips any aura::Window named ParentWindow.
-class TestAXAuraWindowUtils : public AXAuraWindowUtils {
- public:
-  TestAXAuraWindowUtils() = default;
-  ~TestAXAuraWindowUtils() override = default;
-
- private:
-  aura::Window* GetParent(aura::Window* window) override {
-    aura::Window* parent = window->parent();
-    if (parent && parent->GetTitle() == base::ASCIIToUTF16("ParentWindow"))
-      return parent->parent();
-    return parent;
-  }
-
-  aura::Window::Windows GetChildren(aura::Window* window) override {
-    auto children = window->children();
-    if (children.size() == 1 &&
-        children[0]->GetTitle() == base::ASCIIToUTF16("ParentWindow"))
-      return children[0]->children();
-    return children;
-  }
-};
-
-using AuraAXTreeSerializer = ui::
-    AXTreeSerializer<views::AXAuraObjWrapper*, ui::AXNodeData, ui::AXTreeData>;
-
-using AuraAXTreeSourceChecker =
-    ui::AXTreeSourceChecker<views::AXAuraObjWrapper*,
-                            ui::AXNodeData,
-                            ui::AXTreeData>;
-
-class AXAuraWindowUtilsTest : public ViewsTestBase {
- public:
-  AXAuraWindowUtilsTest() = default;
-  ~AXAuraWindowUtilsTest() override = default;
-
-  void SetUp() override {
-    ViewsTestBase::SetUp();
-
-    parent_widget_ = std::make_unique<Widget>();
-    Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
-    params.bounds = gfx::Rect(0, 0, 200, 200);
-    params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-    parent_widget_->Init(params);
-    parent_widget_->GetNativeWindow()->SetTitle(
-        base::ASCIIToUTF16("ParentWindow"));
-    parent_widget_->Show();
-
-    child_widget_ = new Widget();  // Owned by parent_widget_.
-    params = CreateParams(Widget::InitParams::TYPE_BUBBLE);
-    params.parent = parent_widget_->GetNativeWindow();
-    params.child = true;
-    params.bounds = gfx::Rect(100, 100, 200, 200);
-    params.ownership = views::Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET;
-    child_widget_->Init(params);
-    auto* button = new LabelButton(nullptr, base::ASCIIToUTF16("ChildButton"));
-    button->SetSize(gfx::Size(20, 20));
-    child_widget_->GetContentsView()->AddChildView(button);
-    child_widget_->GetNativeWindow()->SetTitle(
-        base::ASCIIToUTF16("ChildWindow"));
-    child_widget_->Show();
-  }
-
-  void TearDown() override {
-    // Close and reset the parent widget. The child widget will be cleaned
-    // up automatically as it's owned by the parent widget.
-    if (!parent_widget_->IsClosed())
-      parent_widget_->CloseNow();
-    parent_widget_.reset();
-    ViewsTestBase::TearDown();
-  }
-
- protected:
-  std::unique_ptr<ui::AXTree> GetAccessibilityTreeFromWindow(
-      aura::Window* window) {
-    ui::AXTreeID tree_id = ui::AXTreeID::CreateNewAXTreeID();
-    AXAuraObjCache cache;
-    AXTreeSourceViews tree_source(cache.GetOrCreate(window), tree_id, &cache);
-    AuraAXTreeSerializer serializer(&tree_source);
-    ui::AXTreeUpdate serialized_tree;
-    serializer.SerializeChanges(tree_source.GetRoot(), &serialized_tree);
-
-    AuraAXTreeSourceChecker checker(&tree_source);
-    if (!checker.Check())
-      return std::make_unique<ui::AXTree>();
-
-    // For debugging, run with --v=1.
-    VLOG(1) << serialized_tree.ToString();
-
-    return std::make_unique<ui::AXTree>(serialized_tree);
-  }
-
-  std::unique_ptr<Widget> parent_widget_;
-  Widget* child_widget_ = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AXAuraWindowUtilsTest);
-};
-
-TEST_F(AXAuraWindowUtilsTest, GetHierarchy) {
-  aura::Window* window = child_widget_->GetNativeWindow();
-  aura::Window* root = window->GetRootWindow();
-  std::unique_ptr<ui::AXTree> ax_tree = GetAccessibilityTreeFromWindow(root);
-
-  // For debugging, run with --v=1.
-  VLOG(1) << ax_tree->ToString();
-
-  EXPECT_TRUE(HasNodeWithName(ax_tree.get(), "ParentWindow"));
-  EXPECT_TRUE(HasNodeWithName(ax_tree.get(), "ChildWindow"));
-  EXPECT_TRUE(HasNodeWithName(ax_tree.get(), "ChildButton"));
-}
-
-TEST_F(AXAuraWindowUtilsTest, GetHierarchyWithTestAuraWindowUtils) {
-  // TestAXAuraWindowUtils will skip over an aura::Window
-  // with a title of "ParentWindow".
-  AXAuraWindowUtils::Set(std::make_unique<TestAXAuraWindowUtils>());
-
-  aura::Window* window = child_widget_->GetNativeWindow();
-  aura::Window* root = window->GetRootWindow();
-  std::unique_ptr<ui::AXTree> ax_tree = GetAccessibilityTreeFromWindow(root);
-
-  // For debugging, run with --v=1.
-  VLOG(1) << ax_tree->ToString();
-
-  EXPECT_FALSE(HasNodeWithName(ax_tree.get(), "ParentWindow"));
-  EXPECT_TRUE(HasNodeWithName(ax_tree.get(), "ChildWindow"));
-  EXPECT_TRUE(HasNodeWithName(ax_tree.get(), "ChildButton"));
-}
-
-}  // namespace
-}  // namespace views
diff --git a/ui/views/accessibility/ax_window_obj_wrapper.cc b/ui/views/accessibility/ax_window_obj_wrapper.cc
index d13591bf..2150851 100644
--- a/ui/views/accessibility/ax_window_obj_wrapper.cc
+++ b/ui/views/accessibility/ax_window_obj_wrapper.cc
@@ -14,7 +14,6 @@
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/window.h"
 #include "ui/views/accessibility/ax_aura_obj_cache.h"
-#include "ui/views/accessibility/ax_aura_window_utils.h"
 #include "ui/views/widget/widget.h"
 
 namespace views {
@@ -44,7 +43,7 @@
                                        aura::Window* window)
     : AXAuraObjWrapper(aura_obj_cache),
       window_(window),
-      is_root_window_(AXAuraWindowUtils::Get()->IsRootWindow(window)) {
+      is_root_window_(window->IsRootWindow()) {
   window->AddObserver(this);
 
   if (is_root_window_)
@@ -60,7 +59,7 @@
 }
 
 AXAuraObjWrapper* AXWindowObjWrapper::GetParent() {
-  aura::Window* parent = AXAuraWindowUtils::Get()->GetParent(window_);
+  aura::Window* parent = window_->parent();
   if (!parent)
     return nullptr;
 
@@ -69,8 +68,7 @@
 
 void AXWindowObjWrapper::GetChildren(
     std::vector<AXAuraObjWrapper*>* out_children) {
-  aura::Window::Windows children =
-      AXAuraWindowUtils::Get()->GetChildren(window_);
+  aura::Window::Windows children = window_->children();
   for (size_t i = 0; i < children.size(); ++i) {
     out_children->push_back(aura_obj_cache_->GetOrCreate(children[i]));
   }
@@ -193,8 +191,7 @@
       root_view->NotifyAccessibilityEvent(event_type, true);
   }
 
-  aura::Window::Windows children =
-      AXAuraWindowUtils::Get()->GetChildren(window);
+  aura::Window::Windows children = window->children();
   for (size_t i = 0; i < children.size(); ++i)
     FireEvent(children[i], ax::mojom::Event::kLocationChanged);
 }
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.cc b/ui/views/accessibility/view_ax_platform_node_delegate.cc
index bd98c05..9bef298 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -388,6 +388,17 @@
   return false;
 }
 
+base::string16 ViewAXPlatformNodeDelegate::GetAuthorUniqueId() const {
+  const View* v = view();
+  if (v) {
+    const int view_id = v->GetID();
+    if (view_id)
+      return base::WideToUTF16(L"view_") + base::NumberToString16(view_id);
+  }
+
+  return base::string16();
+}
+
 const ui::AXUniqueId& ViewAXPlatformNodeDelegate::GetUniqueId() const {
   return ViewAccessibility::GetUniqueId();
 }
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.h b/ui/views/accessibility/view_ax_platform_node_delegate.h
index 455052d..bc16cfef 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.h
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.h
@@ -61,6 +61,7 @@
   bool AccessibilityPerformAction(const ui::AXActionData& data) override;
   bool ShouldIgnoreHoveredStateForTesting() override;
   bool IsOffscreen() const override;
+  base::string16 GetAuthorUniqueId() const override;
   // Also in |ViewAccessibility|.
   const ui::AXUniqueId& GetUniqueId() const override;
 
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
index 2ee0c91..7f57a11 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -51,9 +51,11 @@
     widget_->Init(params);
 
     button_ = new TestButton();
+    button_->SetID(NON_DEFAULT_VIEW_ID);
     button_->SetSize(gfx::Size(20, 20));
 
     label_ = new Label();
+    label_->SetID(DEFAULT_VIEW_ID);
     button_->AddChildView(label_);
 
     widget_->GetContentsView()->AddChildView(button_);
@@ -84,6 +86,9 @@
   }
 
  protected:
+  const int DEFAULT_VIEW_ID = 0;
+  const int NON_DEFAULT_VIEW_ID = 1;
+
   Widget* widget_ = nullptr;
   Button* button_ = nullptr;
   Label* label_ = nullptr;
@@ -171,6 +176,15 @@
   EXPECT_FALSE(SetFocused(button_accessibility(), true));
 }
 
+TEST_F(ViewAXPlatformNodeDelegateTest, GetAuthorUniqueIdDefault) {
+  ASSERT_EQ(base::WideToUTF16(L""), label_accessibility()->GetAuthorUniqueId());
+}
+
+TEST_F(ViewAXPlatformNodeDelegateTest, GetAuthorUniqueIdNonDefault) {
+  ASSERT_EQ(base::WideToUTF16(L"view_1"),
+            button_accessibility()->GetAuthorUniqueId());
+}
+
 #if defined(USE_AURA)
 class DerivedTestView : public View {
  public:
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc
index 8d2afbb..64a1451 100644
--- a/ui/views/animation/ink_drop_host_view.cc
+++ b/ui/views/animation/ink_drop_host_view.cc
@@ -49,14 +49,8 @@
 }
 
 void InkDropHostView::AddInkDropLayer(ui::Layer* ink_drop_layer) {
-  old_paint_to_layer_ = layer() != nullptr;
-  if (!old_paint_to_layer_)
-    SetPaintToLayer();
-
-  layer()->SetFillsBoundsOpaquely(false);
   InstallInkDropMask(ink_drop_layer);
-  layer()->Add(ink_drop_layer);
-  layer()->StackAtBottom(ink_drop_layer);
+  AddLayerBeneathView(ink_drop_layer);
 }
 
 void InkDropHostView::RemoveInkDropLayer(ui::Layer* ink_drop_layer) {
@@ -65,11 +59,9 @@
   // would be wrong.
   if (destroying_)
     return;
-  layer()->Remove(ink_drop_layer);
+  RemoveLayerBeneathView(ink_drop_layer);
   // Layers safely handle destroying a mask layer before the masked layer.
   ink_drop_mask_.reset();
-  if (!old_paint_to_layer_)
-    DestroyLayer();
 }
 
 std::unique_ptr<InkDrop> InkDropHostView::CreateInkDrop() {
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h
index cb9ef74..3087973 100644
--- a/ui/views/animation/ink_drop_host_view.h
+++ b/ui/views/animation/ink_drop_host_view.h
@@ -225,10 +225,6 @@
   int ink_drop_small_corner_radius_ = 2;
   int ink_drop_large_corner_radius_ = 4;
 
-  // Determines whether the view was already painting to layer before adding ink
-  // drop layer.
-  bool old_paint_to_layer_ = false;
-
   bool destroying_ = false;
 
   std::unique_ptr<views::InkDropMask> ink_drop_mask_;
diff --git a/ui/views/animation/ink_drop_impl.cc b/ui/views/animation/ink_drop_impl.cc
index 2c8b6c5..4830ecc 100644
--- a/ui/views/animation/ink_drop_impl.cc
+++ b/ui/views/animation/ink_drop_impl.cc
@@ -630,7 +630,8 @@
   // |root_layer_| should fill the entire host because it affects the clipping
   // when a mask layer is applied to it. This will not affect clipping if no
   // mask layer is set.
-  root_layer_->SetBounds(gfx::Rect(new_size));
+  root_layer_->SetBounds(gfx::Rect(new_size) +
+                         root_layer_->bounds().OffsetFromOrigin());
 
   const bool create_ink_drop_ripple = !!ink_drop_ripple_;
   InkDropState state = GetTargetInkDropState();
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index 4144b0c..25427f9 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <algorithm>
 #include <utility>
 
 #include "base/lazy_instance.h"
@@ -60,8 +61,6 @@
   SetTextInternal(text);
 
   AddChildView(ink_drop_container_);
-  ink_drop_container_->SetPaintToLayer();
-  ink_drop_container_->layer()->SetFillsBoundsOpaquely(false);
   ink_drop_container_->SetVisible(false);
 
   AddChildView(image_);
@@ -360,25 +359,25 @@
   SchedulePaint();
 }
 
-void LabelButton::AddInkDropLayer(ui::Layer* ink_drop_layer) {
-  image()->SetPaintToLayer();
-  image()->layer()->SetFillsBoundsOpaquely(false);
-  ink_drop_container_->AddInkDropLayer(ink_drop_layer);
-  InstallInkDropMask(ink_drop_layer);
-}
-
-void LabelButton::RemoveInkDropLayer(ui::Layer* ink_drop_layer) {
-  image()->DestroyLayer();
-  ResetInkDropMask();
-  ink_drop_container_->RemoveInkDropLayer(ink_drop_layer);
-}
-
 void LabelButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   if (is_default())
     node_data->AddState(ax::mojom::State::kDefault);
   Button::GetAccessibleNodeData(node_data);
 }
 
+void LabelButton::AddLayerBeneathView(ui::Layer* new_layer) {
+  image()->SetPaintToLayer();
+  image()->layer()->SetFillsBoundsOpaquely(false);
+  ink_drop_container()->SetVisible(true);
+  ink_drop_container()->AddLayerBeneathView(new_layer);
+}
+
+void LabelButton::RemoveLayerBeneathView(ui::Layer* old_layer) {
+  ink_drop_container()->RemoveLayerBeneathView(old_layer);
+  ink_drop_container()->SetVisible(false);
+  image()->DestroyLayer();
+}
+
 void LabelButton::StateChanged(ButtonState old_state) {
   const gfx::Size previous_image_size(image_->GetPreferredSize());
   UpdateImage();
diff --git a/ui/views/controls/button/label_button.h b/ui/views/controls/button/label_button.h
index 137b65a..4dc555db 100644
--- a/ui/views/controls/button/label_button.h
+++ b/ui/views/controls/button/label_button.h
@@ -96,9 +96,9 @@
   void Layout() override;
   const char* GetClassName() const override;
   void EnableCanvasFlippingForRTLUI(bool flip) override;
-  void AddInkDropLayer(ui::Layer* ink_drop_layer) override;
-  void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override;
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
+  void AddLayerBeneathView(ui::Layer* new_layer) override;
+  void RemoveLayerBeneathView(ui::Layer* old_layer) override;
 
  protected:
   ImageView* image() const { return image_; }
diff --git a/ui/views/metadata/metadata_types.h b/ui/views/metadata/metadata_types.h
index a534b10..87427de 100644
--- a/ui/views/metadata/metadata_types.h
+++ b/ui/views/metadata/metadata_types.h
@@ -176,10 +176,7 @@
 // (so it will trigger things like property changed notifications).
 template <typename TClass,
           typename TValue,
-          void (TClass::*Set)(
-              typename std::conditional<std::is_fundamental<TValue>::value,
-                                        TValue,
-                                        const TValue&>::type),
+          void (TClass::*Set)(ArgType<TValue>),
           TValue (TClass::*Get)() const>
 class ClassPropertyMetaData
     : public ClassPropertyReadOnlyMetaData<TClass, TValue, Get> {
diff --git a/ui/views/metadata/type_conversion.cc b/ui/views/metadata/type_conversion.cc
index 8e7de6b..e992d145 100644
--- a/ui/views/metadata/type_conversion.cc
+++ b/ui/views/metadata/type_conversion.cc
@@ -23,59 +23,58 @@
 }
 
 template <>
-base::string16 ConvertToString<int8_t>(const int8_t& source_value) {
+base::string16 ConvertToString<int8_t>(int8_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<int16_t>(const int16_t& source_value) {
+base::string16 ConvertToString<int16_t>(int16_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<int32_t>(const int32_t& source_value) {
+base::string16 ConvertToString<int32_t>(int32_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<int64_t>(const int64_t& source_value) {
+base::string16 ConvertToString<int64_t>(int64_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<uint8_t>(const uint8_t& source_value) {
+base::string16 ConvertToString<uint8_t>(uint8_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<uint16_t>(const uint16_t& source_value) {
+base::string16 ConvertToString<uint16_t>(uint16_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<uint32_t>(const uint32_t& source_value) {
+base::string16 ConvertToString<uint32_t>(uint32_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<uint64_t>(const uint64_t& source_value) {
+base::string16 ConvertToString<uint64_t>(uint64_t source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<float>(const float& source_value) {
+base::string16 ConvertToString<float>(float source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<double>(const double& source_value) {
+base::string16 ConvertToString<double>(double source_value) {
   return base::NumberToString16(source_value);
 }
 
 template <>
-base::string16 ConvertToString<bool>(const bool& source_value) {
-  return source_value ? base::ASCIIToUTF16("true")
-                      : base::ASCIIToUTF16("false");
+base::string16 ConvertToString<bool>(bool source_value) {
+  return base::ASCIIToUTF16(source_value ? "true" : "false");
 }
 
 template <>
diff --git a/ui/views/metadata/type_conversion.h b/ui/views/metadata/type_conversion.h
index cc9068c..72700e3 100644
--- a/ui/views/metadata/type_conversion.h
+++ b/ui/views/metadata/type_conversion.h
@@ -18,11 +18,21 @@
 namespace views {
 namespace metadata {
 
+// Various metadata methods pass types either by value or const ref depending on
+// whether the types are "small" (defined as "fundamental, enum, or pointer").
+// ArgType<T> gives the appropriate type to use as an argument in such cases.
+template <typename T>
+using ArgType = typename std::conditional<std::is_fundamental<T>::value ||
+                                              std::is_enum<T>::value ||
+                                              std::is_pointer<T>::value,
+                                          T,
+                                          const T&>::type;
+
 // TypeConverter Class --------------------------------------------------------
 template <typename TSource, typename TTarget>
 class TypeConverter {
  public:
-  static TTarget Convert(const TSource& source_val) = delete;
+  static TTarget Convert(ArgType<TSource>) = delete;
 
  private:
   TypeConverter();
@@ -30,58 +40,51 @@
 
 // Master Type Conversion Function --------------------------------------------
 template <typename TSource, typename TTarget>
-TTarget Convert(const TSource& source_value) {
+TTarget Convert(ArgType<TSource> source_value) {
   return TypeConverter<TSource, TTarget>::Convert(source_value);
 }
 
 // String Conversions ---------------------------------------------------------
 
 template <typename TSource>
-base::string16 ConvertToString(const TSource& source_value) = delete;
+base::string16 ConvertToString(ArgType<TSource>) = delete;
 
 template <>
 VIEWS_EXPORT base::string16 ConvertToString<base::string16>(
     const base::string16& source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<int8_t>(const int8_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<int8_t>(int8_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<int16_t>(
-    const int16_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<int16_t>(int16_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<int32_t>(
-    const int32_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<int32_t>(int32_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<int64_t>(
-    const int64_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<int64_t>(int64_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<uint8_t>(
-    const uint8_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<uint8_t>(uint8_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<uint16_t>(
-    const uint16_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<uint16_t>(uint16_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<uint32_t>(
-    const uint32_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<uint32_t>(uint32_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<uint64_t>(
-    const uint64_t& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<uint64_t>(uint64_t source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<float>(const float& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<float>(float source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<double>(const double& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<double>(double source_value);
 
 template <>
-VIEWS_EXPORT base::string16 ConvertToString<bool>(const bool& source_value);
+VIEWS_EXPORT base::string16 ConvertToString<bool>(bool source_value);
 
 template <>
 VIEWS_EXPORT base::string16 ConvertToString<gfx::Size>(
@@ -90,8 +93,8 @@
 template <typename TSource>
 class TypeConverter<TSource, base::string16> {
  public:
-  static base::string16 Convert(const TSource& source_val) {
-    return ConvertToString<TSource>(source_val);
+  static base::string16 Convert(ArgType<TSource> source_value) {
+    return ConvertToString<TSource>(source_value);
   }
 };
 
diff --git a/ui/views/test/platform_test_helper_mus.cc b/ui/views/test/platform_test_helper_mus.cc
index 5ce4676..ceb400ee 100644
--- a/ui/views/test/platform_test_helper_mus.cc
+++ b/ui/views/test/platform_test_helper_mus.cc
@@ -147,14 +147,14 @@
                     .RequireCapability("*", "test")
                     .Build()});
 
-    service_manager::mojom::ServicePtr service;
+    service_manager::mojom::ServicePtrInfo service;
     default_service_binding_.Bind(mojo::MakeRequest(&service));
     // The service name matches the name field in unittests_manifest.json.
     background_service_manager_->RegisterService(
         service_manager::Identity(kServiceName,
                                   service_manager::kSystemInstanceGroup,
                                   base::Token{}, base::Token::CreateRandom()),
-        std::move(service), nullptr);
+        std::move(service), mojo::NullReceiver());
     service_manager_connector_ =
         default_service_binding_.GetConnector()->Clone();
     service_manager_identity_ = default_service_binding_.identity();
diff --git a/ui/views/view.cc b/ui/views/view.cc
index dbd2360..5e6b31e 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -141,6 +141,9 @@
 
   for (ViewObserver& observer : observers_)
     observer.OnViewIsDeleting(this);
+
+  for (ui::Layer* layer_beneath : layers_beneath_)
+    layer_beneath->RemoveObserver(this);
 }
 
 // Tree operations -------------------------------------------------------------
@@ -504,6 +507,9 @@
     layer()->SetTransform(transform);
     layer()->ScheduleDraw();
   }
+
+  for (ui::Layer* layer_beneath : layers_beneath_)
+    layer_beneath->SetTransform(transform);
 }
 
 void View::SetPaintToLayer(ui::LayerType layer_type) {
@@ -530,6 +536,53 @@
   CreateOrDestroyLayer();
 }
 
+void View::AddLayerBeneathView(ui::Layer* new_layer) {
+  DCHECK(new_layer);
+  DCHECK(!base::ContainsValue(layers_beneath_, new_layer))
+      << "Layer already added.";
+
+  new_layer->AddObserver(this);
+  new_layer->SetVisible(visible());
+  layers_beneath_.push_back(new_layer);
+
+  // If painting to a layer already, ensure |new_layer| gets added and stacked
+  // correctly. If not, this will happen on layer creation.
+  if (layer()) {
+    ui::Layer* parent_layer = layer()->parent();
+    if (parent_layer)
+      parent_layer->Add(new_layer);
+    new_layer->SetBounds(gfx::Rect(new_layer->size()) +
+                         layer()->bounds().OffsetFromOrigin());
+    if (parent())
+      parent()->ReorderLayers();
+  }
+
+  CreateOrDestroyLayer();
+
+  layer()->SetFillsBoundsOpaquely(false);
+}
+
+void View::RemoveLayerBeneathView(ui::Layer* old_layer) {
+  auto layer_pos =
+      std::find(layers_beneath_.begin(), layers_beneath_.end(), old_layer);
+  DCHECK(layer_pos != layers_beneath_.end())
+      << "Attempted to remove a layer that was never added.";
+  layers_beneath_.erase(layer_pos);
+  old_layer->RemoveObserver(this);
+
+  ui::Layer* parent_layer = layer()->parent();
+  if (parent_layer)
+    parent_layer->Remove(old_layer);
+
+  CreateOrDestroyLayer();
+}
+
+void View::LayerDestroyed(ui::Layer* layer) {
+  // Only layers added with |AddLayerBeneathView()| are observed so |layer| can
+  // safely be removed.
+  RemoveLayerBeneathView(layer);
+}
+
 std::unique_ptr<ui::Layer> View::RecreateLayer() {
   std::unique_ptr<ui::Layer> old_layer = LayerOwner::RecreateLayer();
   Widget* widget = GetWidget();
@@ -1625,6 +1678,9 @@
 
   if (layer() && parent_layer != layer()) {
     parent_layer->Add(layer());
+    for (ui::Layer* layer_beneath : layers_beneath_)
+      parent_layer->Add(layer_beneath);
+
     SetLayerBounds(size(), local_offset_data);
   } else {
     internal::ScopedChildrenLock lock(this);
@@ -1642,16 +1698,24 @@
 }
 
 void View::UpdateChildLayerVisibility(bool ancestor_visible) {
+  const bool layers_visible = ancestor_visible && visible_;
   if (layer()) {
-    layer()->SetVisible(ancestor_visible && visible_);
+    layer()->SetVisible(layers_visible);
+    for (ui::Layer* layer_beneath : layers_beneath_)
+      layer_beneath->SetVisible(layers_visible);
   } else {
     internal::ScopedChildrenLock lock(this);
     for (auto* child : children_)
-      child->UpdateChildLayerVisibility(ancestor_visible && visible_);
+      child->UpdateChildLayerVisibility(layers_visible);
   }
 }
 
 void View::DestroyLayerImpl(LayerChangeNotifyBehavior notify_parents) {
+  // Normally, adding layers beneath will trigger painting to a layer. It would
+  // leave this view in an inconsistent state if its layer were destroyed while
+  // layers beneath were still present. So, assume this doesn't happen.
+  DCHECK(layers_beneath_.empty());
+
   if (!layer())
     return;
 
@@ -1730,7 +1794,8 @@
 }
 
 void View::CreateOrDestroyLayer() {
-  if (paint_to_layer_explicitly_set_ || paint_to_layer_for_transform_) {
+  if (paint_to_layer_explicitly_set_ || paint_to_layer_for_transform_ ||
+      !layers_beneath_.empty()) {
     // If we need to paint to a layer, make sure we have one.
     if (!layer())
       CreateLayer(ui::LAYER_TEXTURED);
@@ -1770,6 +1835,8 @@
   if (layer() && layer() != parent_layer) {
     DCHECK_EQ(parent_layer, layer()->parent());
     parent_layer->StackAtBottom(layer());
+    for (ui::Layer* layer_beneath : layers_beneath_)
+      parent_layer->StackAtBottom(layer_beneath);
   } else {
     // Iterate backwards through the children so that a child with a layer
     // which is further to the back is stacked above one which is further to
@@ -2258,12 +2325,19 @@
       layer()->GetCompositor()) {
     if (layer()->GetCompositor()->is_pixel_canvas()) {
       layer()->SetSubpixelPositionOffset(offset_data.GetSubpixelOffset());
+      for (ui::Layer* layer_beneath : layers_beneath_)
+        layer_beneath->SetSubpixelPositionOffset(
+            offset_data.GetSubpixelOffset());
     } else {
       ui::SnapLayerToPhysicalPixelBoundary(layer()->parent(), layer());
+      for (ui::Layer* layer_beneath : layers_beneath_)
+        ui::SnapLayerToPhysicalPixelBoundary(layer()->parent(), layer_beneath);
     }
   } else {
     // Reset the offset.
     layer()->SetSubpixelPositionOffset(gfx::Vector2dF());
+    for (ui::Layer* layer_beneath : layers_beneath_)
+      layer_beneath->SetSubpixelPositionOffset(gfx::Vector2dF());
   }
 }
 
@@ -2332,7 +2406,12 @@
 
 void View::SetLayerBounds(const gfx::Size& size,
                           const LayerOffsetData& offset_data) {
-  layer()->SetBounds(gfx::Rect(size) + offset_data.offset());
+  const gfx::Rect bounds = gfx::Rect(size) + offset_data.offset();
+  layer()->SetBounds(bounds);
+  for (ui::Layer* layer_beneath : layers_beneath_) {
+    layer_beneath->SetBounds(gfx::Rect(layer_beneath->size()) +
+                             bounds.OffsetFromOrigin());
+  }
   SnapLayerToPixelBoundary(offset_data);
 }
 
@@ -2452,8 +2531,12 @@
 
 void View::OrphanLayers() {
   if (layer()) {
-    if (layer()->parent())
-      layer()->parent()->Remove(layer());
+    ui::Layer* parent = layer()->parent();
+    if (parent) {
+      parent->Remove(layer());
+      for (ui::Layer* layer_beneath : layers_beneath_)
+        parent->Remove(layer_beneath);
+    }
 
     // The layer belonging to this View has already been orphaned. It is not
     // necessary to orphan the child layers.
@@ -2466,9 +2549,15 @@
 
 void View::ReparentLayer(const gfx::Vector2d& offset, ui::Layer* parent_layer) {
   layer()->SetBounds(GetLocalBounds() + offset);
+  for (ui::Layer* layer_beneath : layers_beneath_)
+    layer_beneath->SetBounds(gfx::Rect(layer_beneath->size()) + offset);
+
   DCHECK_NE(layer(), parent_layer);
-  if (parent_layer)
+  if (parent_layer) {
     parent_layer->Add(layer());
+    for (ui::Layer* layer_beneath : layers_beneath_)
+      parent_layer->Add(layer_beneath);
+  }
   layer()->SchedulePaint(GetLocalBounds());
   MoveLayerToParent(layer(), LayerOffsetData(layer()->device_scale_factor()));
 }
diff --git a/ui/views/view.h b/ui/views/view.h
index 41aff91..b6e25b5c 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -33,6 +33,7 @@
 #include "ui/base/dragdrop/os_exchange_data.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/compositor/layer_delegate.h"
+#include "ui/compositor/layer_observer.h"
 #include "ui/compositor/layer_owner.h"
 #include "ui/compositor/paint_cache.h"
 #include "ui/events/event.h"
@@ -268,6 +269,7 @@
 //   END_METADATA()
 /////////////////////////////////////////////////////////////////////////////
 class VIEWS_EXPORT View : public ui::LayerDelegate,
+                          public ui::LayerObserver,
                           public ui::LayerOwner,
                           public ui::AcceleratorTarget,
                           public ui::EventTarget,
@@ -604,6 +606,8 @@
   // Sets the transform to the supplied transform.
   void SetTransform(const gfx::Transform& transform);
 
+  // Accelerated painting ------------------------------------------------------
+
   // Sets whether this view paints to a layer. A view paints to a layer if
   // either of the following are true:
   // . the view has a non-identity transform.
@@ -621,6 +625,23 @@
   // for another reason.
   void DestroyLayer();
 
+  // Add or remove layers below this view. This view does not take ownership of
+  // the layers. It is the caller's responsibility to keep track of this View's
+  // size and update their layer accordingly.
+  //
+  // In very rare cases, it may be necessary to override these. If any of this
+  // view's contents must be painted to the same layer as its parent, or can't
+  // handle being painted with transparency, overriding might be appropriate.
+  // One example is LabelButton, where the label must paint below any added
+  // layers for subpixel rendering reasons. Overrides should be made
+  // judiciously, and generally they should just forward the calls to a child
+  // view. They must be overridden together for correctness.
+  virtual void AddLayerBeneathView(ui::Layer* new_layer);
+  virtual void RemoveLayerBeneathView(ui::Layer* old_layer);
+
+  // ui::LayerObserver:
+  void LayerDestroyed(ui::Layer* layer) override;
+
   // Overridden from ui::LayerOwner:
   std::unique_ptr<ui::Layer> RecreateLayer() override;
 
@@ -1962,6 +1983,11 @@
   // Whether we are painting to a layer because of a non-identity transform.
   bool paint_to_layer_for_transform_ = false;
 
+  // Set of layers that should be painted beneath this View's layer. These
+  // layers are maintained as siblings of this View's layer and are stacked
+  // beneath.
+  std::vector<ui::Layer*> layers_beneath_;
+
   // Accelerators --------------------------------------------------------------
 
   // Focus manager accelerators registered on.
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 0d86fda3..139df2a7 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -34,6 +34,7 @@
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/paint_context.h"
 #include "ui/compositor/test/draw_waiter_for_test.h"
+#include "ui/compositor/test/test_layers.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -4558,6 +4559,233 @@
   EXPECT_EQ("0.00 0.00", ToString(v11->layer()->subpixel_position_offset()));
 }
 
+TEST_F(ViewLayerTest, LayerBeneathTriggersPaintToLayer) {
+  View root;
+  root.SetPaintToLayer();
+
+  View* view = root.AddChildView(std::make_unique<View>());
+  EXPECT_EQ(nullptr, view->layer());
+
+  ui::Layer layer1;
+  ui::Layer layer2;
+  view->AddLayerBeneathView(&layer1);
+  EXPECT_NE(nullptr, view->layer());
+  view->AddLayerBeneathView(&layer2);
+  EXPECT_NE(nullptr, view->layer());
+
+  view->RemoveLayerBeneathView(&layer1);
+  EXPECT_NE(nullptr, view->layer());
+  view->RemoveLayerBeneathView(&layer2);
+  EXPECT_EQ(nullptr, view->layer());
+}
+
+TEST_F(ViewLayerTest, LayerBeneathAddedToTree) {
+  View root;
+  root.SetPaintToLayer();
+
+  ui::Layer layer;
+  View* view = root.AddChildView(std::make_unique<View>());
+
+  view->AddLayerBeneathView(&layer);
+  ASSERT_NE(nullptr, view->layer());
+  EXPECT_TRUE(view->layer()->parent()->Contains(&layer));
+
+  view->RemoveLayerBeneathView(&layer);
+  EXPECT_EQ(nullptr, layer.parent());
+}
+
+TEST_F(ViewLayerTest, LayerBeneathRemovedOnDestruction) {
+  View root;
+  root.SetPaintToLayer();
+
+  auto layer = std::make_unique<ui::Layer>();
+  View* view = root.AddChildView(std::make_unique<View>());
+
+  // No assertions, just get coverage of deleting the layer while it is added.
+  view->AddLayerBeneathView(layer.get());
+  layer.reset();
+  root.RemoveChildView(view);
+  delete view;
+}
+
+TEST_F(ViewLayerTest, LayerBeneathVisibilityUpdated) {
+  View root;
+  root.SetPaintToLayer();
+
+  ui::Layer layer;
+
+  // Make a parent view that has no layer, and a child view that has a layer.
+  View* parent = root.AddChildView(std::make_unique<View>());
+  View* child = parent->AddChildView(std::make_unique<View>());
+  child->AddLayerBeneathView(&layer);
+
+  EXPECT_EQ(nullptr, parent->layer());
+  EXPECT_NE(nullptr, child->layer());
+
+  // Test setting the views' visbilities in various orders.
+  EXPECT_TRUE(layer.visible());
+  child->SetVisible(false);
+  EXPECT_FALSE(layer.visible());
+  child->SetVisible(true);
+  EXPECT_TRUE(layer.visible());
+
+  parent->SetVisible(false);
+  EXPECT_FALSE(layer.visible());
+  parent->SetVisible(true);
+  EXPECT_TRUE(layer.visible());
+
+  parent->SetVisible(false);
+  EXPECT_FALSE(layer.visible());
+  child->SetVisible(false);
+  EXPECT_FALSE(layer.visible());
+  parent->SetVisible(true);
+  EXPECT_FALSE(layer.visible());
+  child->SetVisible(true);
+  EXPECT_TRUE(layer.visible());
+
+  child->RemoveLayerBeneathView(&layer);
+
+  // Now check the visibility upon adding.
+  child->SetVisible(false);
+  child->AddLayerBeneathView(&layer);
+  EXPECT_FALSE(layer.visible());
+  child->SetVisible(true);
+  EXPECT_TRUE(layer.visible());
+
+  child->RemoveLayerBeneathView(&layer);
+}
+
+TEST_F(ViewLayerTest, LayerBeneathHasCorrectBounds) {
+  View root;
+  root.SetBoundsRect(gfx::Rect(100, 100));
+  root.SetPaintToLayer();
+
+  View* view = root.AddChildView(std::make_unique<View>());
+  view->SetBoundsRect(gfx::Rect(25, 25, 50, 50));
+
+  // The layer's position will be changed, but its size should be respected.
+  ui::Layer layer;
+  layer.SetBounds(gfx::Rect(25, 25));
+
+  // First check when |view| is already painting to a layer.
+  view->SetPaintToLayer();
+  view->AddLayerBeneathView(&layer);
+  EXPECT_NE(nullptr, layer.parent());
+  EXPECT_EQ(gfx::Rect(25, 25, 25, 25), layer.bounds());
+
+  view->RemoveLayerBeneathView(&layer);
+  EXPECT_EQ(nullptr, layer.parent());
+  layer.SetBounds(gfx::Rect(25, 25));
+
+  // Next check when |view| wasn't painting to a layer.
+  view->DestroyLayer();
+  EXPECT_EQ(nullptr, view->layer());
+  view->AddLayerBeneathView(&layer);
+  EXPECT_NE(nullptr, view->layer());
+  EXPECT_NE(nullptr, layer.parent());
+  EXPECT_EQ(gfx::Rect(25, 25, 25, 25), layer.bounds());
+
+  // Finally check that moving |view| also moves the layer.
+  view->SetBoundsRect(gfx::Rect(50, 50, 50, 50));
+  EXPECT_EQ(gfx::Rect(50, 50, 25, 25), layer.bounds());
+
+  view->RemoveLayerBeneathView(&layer);
+}
+
+TEST_F(ViewLayerTest, LayerBeneathTransformed) {
+  View root;
+  root.SetPaintToLayer();
+
+  ui::Layer layer;
+  View* view = root.AddChildView(std::make_unique<View>());
+  view->SetPaintToLayer();
+  view->AddLayerBeneathView(&layer);
+  EXPECT_TRUE(layer.transform().IsIdentity());
+
+  gfx::Transform transform;
+  transform.Rotate(90);
+  view->SetTransform(transform);
+  EXPECT_EQ(transform, layer.transform());
+  view->SetTransform(gfx::Transform());
+  EXPECT_TRUE(layer.transform().IsIdentity());
+}
+
+TEST_F(ViewLayerTest, LayerBeneathStackedCorrectly) {
+  using ui::test::ChildLayerNamesAsString;
+
+  View root;
+  root.SetPaintToLayer();
+
+  ui::Layer layer;
+  layer.set_name("layer");
+
+  View* v1 = root.AddChildView(std::make_unique<View>());
+  View* v2 = root.AddChildView(std::make_unique<View>());
+  View* v3 = root.AddChildView(std::make_unique<View>());
+
+  // Check that |layer| is stacked correctly as we add more layers to the tree.
+  v2->AddLayerBeneathView(&layer);
+  v2->layer()->set_name("v2");
+  EXPECT_EQ(ChildLayerNamesAsString(*root.layer()), "layer v2");
+  v3->SetPaintToLayer();
+  v3->layer()->set_name("v3");
+  EXPECT_EQ(ChildLayerNamesAsString(*root.layer()), "layer v2 v3");
+  v1->SetPaintToLayer();
+  v1->layer()->set_name("v1");
+  EXPECT_EQ(ChildLayerNamesAsString(*root.layer()), "v1 layer v2 v3");
+
+  v2->RemoveLayerBeneathView(&layer);
+}
+
+TEST_F(ViewLayerTest, LayerBeneathOrphanedOnRemoval) {
+  View root;
+  root.SetPaintToLayer();
+
+  ui::Layer layer;
+  View* view = root.AddChildView(std::make_unique<View>());
+  view->AddLayerBeneathView(&layer);
+  EXPECT_EQ(layer.parent(), root.layer());
+
+  // Ensure that the layer beneath is orphaned and re-parented appropriately.
+  root.RemoveChildView(view);
+  EXPECT_EQ(layer.parent(), nullptr);
+  root.AddChildView(view);
+  EXPECT_EQ(layer.parent(), root.layer());
+
+  view->RemoveLayerBeneathView(&layer);
+}
+
+TEST_F(ViewLayerTest, LayerBeneathMovedWithView) {
+  using ui::test::ChildLayerNamesAsString;
+
+  View root;
+  root.SetPaintToLayer();
+  root.layer()->set_name("root");
+
+  ui::Layer layer;
+  layer.set_name("layer");
+
+  View* v1 = root.AddChildView(std::make_unique<View>());
+  View* v2 = root.AddChildView(std::make_unique<View>());
+  View* v3 = v1->AddChildView(std::make_unique<View>());
+
+  v1->SetPaintToLayer();
+  v1->layer()->set_name("v1");
+  v2->SetPaintToLayer();
+  v2->layer()->set_name("v2");
+  v3->SetPaintToLayer();
+  v3->layer()->set_name("v3");
+
+  // Verify that |layer| is stacked correctly.
+  v3->AddLayerBeneathView(&layer);
+  EXPECT_EQ(ChildLayerNamesAsString(*v1->layer()), "layer v3");
+
+  // Move |v3| to under |v2| and check |layer|'s stacking.
+  v1->RemoveChildView(v3);
+  v2->AddChildView(std::unique_ptr<View>(v3));
+  EXPECT_EQ(ChildLayerNamesAsString(*v2->layer()), "layer v3");
+}
+
 namespace {
 
 class PaintLayerView : public View {
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
index 9504afa..8187937 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
@@ -4,6 +4,7 @@
 <link rel="import" href="../cr_icons_css.html">
 <link rel="import" href="../cr_toolbar/cr_toolbar_search_field.html">
 <link rel="import" href="../hidden_style_css.html">
+<link rel="import" href="../icons.html">
 <link rel="import" href="../shared_vars_css.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html">
 
@@ -54,9 +55,8 @@
       }
 
       cr-icon-button {
-        --cr-icon-button-size:  32px;
+        --cr-icon-button-size: 32px;
         min-width: 32px;
-        padding: 6px 0;
       }
 
       :host-context(html:not([dark])) cr-icon-button {
@@ -144,24 +144,14 @@
         padding: 0;
         width: 20px;
       }
-
-      #menuButton {
-        -webkit-mask-image: url(../../images/icon_toolbar_menu.svg);
-        -webkit-mask-position: center;
-        -webkit-mask-repeat: no-repeat;
-        background: currentColor;
-      }
-
-      :host-context([dark]) #menuButton {
-        -webkit-mask-image: url(../../images/dark/icon_toolbar_menu.svg);
-      }
     </style>
     <div id="leftContent">
       <div id="leftSpacer">
         <!-- Note: showing #menuPromo relies on this dom-if being [restamp]. -->
         <template is="dom-if" if="[[showMenu]]" restamp>
-          <cr-icon-button id="menuButton" class="icon-toolbar-menu no-overlap"
-              on-click="onMenuTap_" aria-label$="[[menuLabel]]"
+          <cr-icon-button id="menuButton" class="no-overlap"
+              iron-icon="cr20:menu" on-click="onMenuTap_"
+              aria-label$="[[menuLabel]]"
               title="[[titleIfNotShowMenuPromo_(menuLabel, showMenuPromo)]]">
           </cr-icon-button>
           <template is="dom-if" if="[[showMenuPromo]]">
diff --git a/ui/webui/resources/cr_elements/icons.html b/ui/webui/resources/cr_elements/icons.html
index b42ef7c..e072289 100644
--- a/ui/webui/resources/cr_elements/icons.html
+++ b/ui/webui/resources/cr_elements/icons.html
@@ -19,6 +19,7 @@
       -->
       <g id="domain"><path d="M2,3 L2,17 L11.8267655,17 L13.7904799,17 L18,17 L18,7 L12,7 L12,3 L2,3 Z M8,13 L10,13 L10,15 L8,15 L8,13 Z M4,13 L6,13 L6,15 L4,15 L4,13 Z M8,9 L10,9 L10,11 L8,11 L8,9 Z M4,9 L6,9 L6,11 L4,11 L4,9 Z M12,9 L16,9 L16,15 L12,15 L12,9 Z M12,11 L14,11 L14,13 L12,13 L12,11 Z M8,5 L10,5 L10,7 L8,7 L8,5 Z M4,5 L6,5 L6,7 L4,7 L4,5 Z"></path></g>
       <g id="kite"><path d="M 10.32 2 L 4.63 8 l 4.92 7.5 l -0.4 0.6 c -0.04 0.07 -0.09 0.12 -0.14 0.18 c -0.24 0.25 -0.56 0.39 -0.9 0.39 c -0.34 0 -0.65 -0.13 -0.9 -0.39 a 1.35 1.35 0 0 1 -0.37 -0.94 a 2.72 2.72 0 0 0 -0.74 -1.88 a 2.44 2.44 0 0 0 -1.78 -0.78 H 4 v 1.38 h 0.33 c 0.34 0 0.65 0.14 0.9 0.39 c 0.24 0.26 0.37 0.59 0.37 0.95 c 0 0.71 0.26 1.38 0.74 1.88 c 0.48 0.5 1.11 0.78 1.78 0.78 c 0.67 0 1.31 -0.28 1.78 -0.78 c 0.11 -0.11 0.2 -0.23 0.28 -0.35 l 1.27 -1.94 L 16 8 L 10.32 2 z"></path></g>
+      <g id="menu"><path d="M2 4h16v2H2zM2 9h16v2H2zM2 14h16v2H2z"></path></g>
   </svg>
 </iron-iconset-svg>
 <iron-iconset-svg name="cr" size="24">
diff --git a/ui/webui/resources/cr_elements_images.grdp b/ui/webui/resources/cr_elements_images.grdp
index c80227d4..397b634 100644
--- a/ui/webui/resources/cr_elements_images.grdp
+++ b/ui/webui/resources/cr_elements_images.grdp
@@ -46,9 +46,6 @@
   <include name="IDR_WEBUI_IMAGES_DARK_ICON_TOOLBAR_CANCEL"
            file="images/dark/icon_toolbar_cancel.svg" type="BINDATA"
            compress="gzip" />
-  <include name="IDR_WEBUI_IMAGES_DARK_ICON_TOOLBAR_MENU"
-           file="images/dark/icon_toolbar_menu.svg" type="BINDATA"
-           compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_DARK_ICON_VISIBILITY"
            file="images/dark/icon_visibility.svg" type="BINDATA"
            compress="gzip" />
@@ -86,8 +83,6 @@
   <include name="IDR_WEBUI_IMAGES_ICON_TOOLBAR_CANCEL"
            file="images/icon_toolbar_cancel.svg" type="BINDATA"
            compress="gzip" />
-  <include name="IDR_WEBUI_IMAGES_ICON_TOOLBAR_MENU"
-           file="images/icon_toolbar_menu.svg" type="BINDATA" compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY"
            file="images/icon_visibility.svg" type="BINDATA" compress="gzip" />
   <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
diff --git a/ui/webui/resources/images/dark/icon_toolbar_menu.svg b/ui/webui/resources/images/dark/icon_toolbar_menu.svg
deleted file mode 100644
index a6b5887..0000000
--- a/ui/webui/resources/images/dark/icon_toolbar_menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#e8eaed"><path d="M2 4h16v2H2zM2 9h16v2H2zM2 14h16v2H2z"/></svg>
\ No newline at end of file
diff --git a/ui/webui/resources/images/icon_toolbar_menu.svg b/ui/webui/resources/images/icon_toolbar_menu.svg
deleted file mode 100644
index bfbb9f96..0000000
--- a/ui/webui/resources/images/icon_toolbar_menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#fff"><path d="M2 4h16v2H2zM2 9h16v2H2zM2 14h16v2H2z"/></svg>
\ No newline at end of file