diff --git a/core/lib/Drupal/Core/Form/WorkspaceDynamicSafeFormInterface.php b/core/lib/Drupal/Core/Form/WorkspaceDynamicSafeFormInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1deae10c7ec9b4a619b425d621fe2d57e79a7138
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/WorkspaceDynamicSafeFormInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Core\Form;
+
+/**
+ * Defines an interface for forms that can be workspace-safe.
+ *
+ * This interface should be used by forms that have to determine whether they're
+ * workspace-safe based on dynamic criteria.
+ *
+ * @see \Drupal\Core\Form\WorkspaceSafeFormInterface
+ */
+interface WorkspaceDynamicSafeFormInterface extends FormInterface {
+
+  /**
+   * Determines whether the form is safe to be submitted in a workspace.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   *
+   * @return bool
+   *   TRUE if the form is workspace-safe, FALSE otherwise.
+   */
+  public function isWorkspaceSafeForm(array $form, FormStateInterface $form_state): bool;
+
+}
diff --git a/core/lib/Drupal/Core/Form/WorkspaceSafeFormInterface.php b/core/lib/Drupal/Core/Form/WorkspaceSafeFormInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7b95b30b083d75f68d6003c27de8cfa325269a1
--- /dev/null
+++ b/core/lib/Drupal/Core/Form/WorkspaceSafeFormInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Core\Form;
+
+/**
+ * Defines an interface for forms that are safe to be submitted in a workspace.
+ *
+ * A form is considered workspace-safe if its submission has no impact on the
+ * Live site.
+ *
+ * @see \Drupal\Core\Form\WorkspaceDynamicSafeFormInterface
+ */
+interface WorkspaceSafeFormInterface extends FormInterface {}
diff --git a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
index 4be13361aff46439edc366633a05259f58864348..cc5a8f1395762ddf5f3168fc968652944101e873 100644
--- a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
+++ b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\SubformState;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
 use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
 use Drupal\Core\Plugin\ContextAwarePluginInterface;
@@ -29,7 +30,7 @@
  * @internal
  *   Form classes are internal.
  */
-abstract class ConfigureBlockFormBase extends FormBase implements BaseFormIdInterface {
+abstract class ConfigureBlockFormBase extends FormBase implements BaseFormIdInterface, WorkspaceDynamicSafeFormInterface {
 
   use AjaxFormHelperTrait;
   use ContextAwarePluginAssignmentTrait;
@@ -164,7 +165,6 @@ public function doBuildForm(array $form, FormStateInterface $form_state, Section
     $this->delta = $delta;
     $this->uuid = $component->getUuid();
     $this->block = $component->getPlugin();
-    $this->markWorkspaceSafe($form_state);
 
     $form_state->setTemporaryValue('gathered_contexts', $this->getPopulatedContexts($section_storage));
 
diff --git a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
index 42166abc1fbf70d692cb2cb2cd5aab57a086f4ba..6a6866885a331d3e509f1324450de7449ba4e536 100644
--- a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
+++ b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
@@ -7,6 +7,7 @@
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\SubformState;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\Core\Layout\LayoutInterface;
 use Drupal\Core\Plugin\ContextAwarePluginInterface;
 use Drupal\Core\Plugin\PluginFormFactoryInterface;
@@ -26,7 +27,7 @@
  * @internal
  *   Form classes are internal.
  */
-class ConfigureSectionForm extends FormBase {
+class ConfigureSectionForm extends FormBase implements WorkspaceDynamicSafeFormInterface {
 
   use AjaxFormHelperTrait;
   use LayoutBuilderContextTrait;
@@ -128,7 +129,6 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     $this->delta = $delta;
     $this->isUpdate = is_null($plugin_id);
     $this->pluginId = $plugin_id;
-    $this->markWorkspaceSafe($form_state);
 
     $section = $this->getCurrentSection();
 
diff --git a/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php b/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
index 2befa97d3b0a54b86e0929e455ab1a6973b37fcb..72eb56ed67335d1f33b510055f6c5628ce01780e 100644
--- a/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
+++ b/core/modules/layout_builder/src/Form/DiscardLayoutChangesForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\SectionStorageInterface;
@@ -15,7 +16,7 @@
  * @internal
  *   Form classes are internal.
  */
-class DiscardLayoutChangesForm extends ConfirmFormBase {
+class DiscardLayoutChangesForm extends ConfirmFormBase implements WorkspaceDynamicSafeFormInterface {
 
   use WorkspaceSafeFormTrait;
 
@@ -89,7 +90,6 @@ public function getCancelUrl() {
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL) {
     $this->sectionStorage = $section_storage;
-    $this->markWorkspaceSafe($form_state);
     // Mark this as an administrative page for JavaScript ("Back to site" link).
     $form['#attached']['drupalSettings']['path']['currentPathIsAdmin'] = TRUE;
     return parent::buildForm($form, $form_state);
diff --git a/core/modules/layout_builder/src/Form/LayoutBuilderDisableForm.php b/core/modules/layout_builder/src/Form/LayoutBuilderDisableForm.php
index 2f7173fb30a75b4d5c80a56e80f98103525b60b3..117a4663e78f569de14bd34056ea1d66ecf05852 100644
--- a/core/modules/layout_builder/src/Form/LayoutBuilderDisableForm.php
+++ b/core/modules/layout_builder/src/Form/LayoutBuilderDisableForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\layout_builder\DefaultsSectionStorageInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
@@ -16,7 +17,7 @@
  * @internal
  *   Form classes are internal.
  */
-class LayoutBuilderDisableForm extends ConfirmFormBase {
+class LayoutBuilderDisableForm extends ConfirmFormBase implements WorkspaceDynamicSafeFormInterface {
 
   use WorkspaceSafeFormTrait;
 
@@ -94,7 +95,6 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     }
 
     $this->sectionStorage = $section_storage;
-    $this->markWorkspaceSafe($form_state);
     // Mark this as an administrative page for JavaScript ("Back to site" link).
     $form['#attached']['drupalSettings']['path']['currentPathIsAdmin'] = TRUE;
     return parent::buildForm($form, $form_state);
diff --git a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
index 8e7cbf4b450d894361242c6a4944b2a69790896a..98875bed408873bb5a9793b338807392091047fb 100644
--- a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
+++ b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\layout_builder\Controller\LayoutRebuildTrait;
 use Drupal\layout_builder\LayoutBuilderHighlightTrait;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
@@ -17,7 +18,7 @@
  * @internal
  *   Form classes are internal.
  */
-abstract class LayoutRebuildConfirmFormBase extends ConfirmFormBase {
+abstract class LayoutRebuildConfirmFormBase extends ConfirmFormBase implements WorkspaceDynamicSafeFormInterface {
 
   use AjaxFormHelperTrait;
   use LayoutBuilderHighlightTrait;
@@ -78,7 +79,6 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     $this->sectionStorage = $section_storage;
     $this->delta = $delta;
 
-    $this->markWorkspaceSafe($form_state);
     $form = parent::buildForm($form, $form_state);
 
     if ($this->isAjax()) {
diff --git a/core/modules/layout_builder/src/Form/MoveBlockForm.php b/core/modules/layout_builder/src/Form/MoveBlockForm.php
index 574f2c5d0d73f69ec7774dfaba555aa8d43d94f2..3c572509a77db68fde3e7604686234e9ff09e1d3 100644
--- a/core/modules/layout_builder/src/Form/MoveBlockForm.php
+++ b/core/modules/layout_builder/src/Form/MoveBlockForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\layout_builder\Context\LayoutBuilderContextTrait;
 use Drupal\layout_builder\Controller\LayoutRebuildTrait;
 use Drupal\layout_builder\LayoutBuilderHighlightTrait;
@@ -18,7 +19,7 @@
  * @internal
  *   Form classes are internal.
  */
-class MoveBlockForm extends FormBase {
+class MoveBlockForm extends FormBase implements WorkspaceDynamicSafeFormInterface {
 
   use AjaxFormHelperTrait;
   use LayoutBuilderContextTrait;
@@ -118,7 +119,6 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     $this->delta = $delta;
     $this->uuid = $uuid;
     $this->region = $region;
-    $this->markWorkspaceSafe($form_state);
 
     $form['#attributes']['data-layout-builder-target-highlight-id'] = $this->blockUpdateHighlightId($uuid);
 
diff --git a/core/modules/layout_builder/src/Form/OverridesEntityForm.php b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
index 77743a3c585dd548fe97ec6ddc028a4210c56c8d..e4e15914446eb937d74d4b7bb2e223809a75af43 100644
--- a/core/modules/layout_builder/src/Form/OverridesEntityForm.php
+++ b/core/modules/layout_builder/src/Form/OverridesEntityForm.php
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityRepositoryInterface;
 use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
 use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
@@ -21,7 +22,7 @@
  * @internal
  *   Form classes are internal.
  */
-class OverridesEntityForm extends ContentEntityForm {
+class OverridesEntityForm extends ContentEntityForm implements WorkspaceDynamicSafeFormInterface {
 
   use PreviewToggleTrait;
   use LayoutBuilderEntityFormTrait;
@@ -91,7 +92,6 @@ protected function init(FormStateInterface $form_state) {
    */
   public function buildForm(array $form, FormStateInterface $form_state, SectionStorageInterface $section_storage = NULL) {
     $this->sectionStorage = $section_storage;
-    $this->markWorkspaceSafe($form_state);
     $form = parent::buildForm($form, $form_state);
     $form['#attributes']['class'][] = 'layout-builder-form';
 
diff --git a/core/modules/layout_builder/src/Form/RevertOverridesForm.php b/core/modules/layout_builder/src/Form/RevertOverridesForm.php
index 9375904e0e6230b7b23e32a1e65a10e1313845b3..9c8932d636348bb6f90a3eff5db545d2c8ab3c12 100644
--- a/core/modules/layout_builder/src/Form/RevertOverridesForm.php
+++ b/core/modules/layout_builder/src/Form/RevertOverridesForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
 use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
 use Drupal\layout_builder\OverridesSectionStorageInterface;
@@ -16,7 +17,7 @@
  * @internal
  *   Form classes are internal.
  */
-class RevertOverridesForm extends ConfirmFormBase {
+class RevertOverridesForm extends ConfirmFormBase implements WorkspaceDynamicSafeFormInterface {
 
   use WorkspaceSafeFormTrait;
 
@@ -101,7 +102,6 @@ public function buildForm(array $form, FormStateInterface $form_state, SectionSt
     }
 
     $this->sectionStorage = $section_storage;
-    $this->markWorkspaceSafe($form_state);
     // Mark this as an administrative page for JavaScript ("Back to site" link).
     $form['#attached']['drupalSettings']['path']['currentPathIsAdmin'] = TRUE;
     return parent::buildForm($form, $form_state);
diff --git a/core/modules/layout_builder/src/Form/WorkspaceSafeFormTrait.php b/core/modules/layout_builder/src/Form/WorkspaceSafeFormTrait.php
index f93986b99c8fe8206172c52c8e14e59c8b94b22e..5cffd8bdf10aee383469ec47b99f116b16499b10 100644
--- a/core/modules/layout_builder/src/Form/WorkspaceSafeFormTrait.php
+++ b/core/modules/layout_builder/src/Form/WorkspaceSafeFormTrait.php
@@ -19,16 +19,17 @@ trait WorkspaceSafeFormTrait {
   protected ?WorkspaceInformationInterface $workspaceInfo = NULL;
 
   /**
-   * Marks a form as workspace-safe, if possible.
+   * Determines whether the current form is safe to be submitted in a workspace.
    *
+   * @param array $form
+   *   An associative array containing the structure of the form.
    * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The form state object.
+   *   The current state of the form.
+   *
+   * @return bool
+   *   TRUE if the form is workspace-safe, FALSE otherwise.
    */
-  protected function markWorkspaceSafe(FormStateInterface $form_state): void {
-    if (!\Drupal::hasService('workspaces.information')) {
-      return;
-    }
-
+  public function isWorkspaceSafeForm(array $form, FormStateInterface $form_state): bool {
     $section_storage = $this->sectionStorage ?: $this->getSectionStorageFromFormState($form_state);
     if ($section_storage) {
       $context_definitions = $section_storage->getContextDefinitions();
@@ -39,10 +40,12 @@ protected function markWorkspaceSafe(FormStateInterface $form_state): void {
         $ignored = $entity && $this->getWorkspaceInfo()->isEntityIgnored($entity);
 
         if ($supported || $ignored) {
-          $form_state->set('workspace_safe', TRUE);
+          return TRUE;
         }
       }
     }
+
+    return FALSE;
   }
 
   /**
diff --git a/core/modules/search/src/Form/SearchBlockForm.php b/core/modules/search/src/Form/SearchBlockForm.php
index 4edcd73a10497193b01a9cfc8ddec319af8f274f..1ded36fe420bbe763240d2de9d96387651f8abe5 100644
--- a/core/modules/search/src/Form/SearchBlockForm.php
+++ b/core/modules/search/src/Form/SearchBlockForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Url;
 use Drupal\search\SearchPageRepositoryInterface;
@@ -15,7 +16,7 @@
  *
  * @internal
  */
-class SearchBlockForm extends FormBase {
+class SearchBlockForm extends FormBase implements WorkspaceSafeFormInterface {
 
   /**
    * The search page repository.
diff --git a/core/modules/search/src/Form/SearchPageForm.php b/core/modules/search/src/Form/SearchPageForm.php
index 4f627d91e812950328f527bfd84857397374b076..06aa988ae2e7ea858de55975b252eda896fdbd68 100644
--- a/core/modules/search/src/Form/SearchPageForm.php
+++ b/core/modules/search/src/Form/SearchPageForm.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Url;
 use Drupal\search\SearchPageInterface;
 
@@ -18,7 +19,7 @@
  *
  * @internal
  */
-class SearchPageForm extends FormBase {
+class SearchPageForm extends FormBase implements WorkspaceSafeFormInterface {
 
   /**
    * The search page entity.
diff --git a/core/modules/views/src/Form/ViewsExposedForm.php b/core/modules/views/src/Form/ViewsExposedForm.php
index 417d97971e923f9aa3a9c3ae5b3068e9e9ae99d6..d68b1dd5363c16f9cfc5e34db26c569298b7bca2 100644
--- a/core/modules/views/src/Form/ViewsExposedForm.php
+++ b/core/modules/views/src/Form/ViewsExposedForm.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Utility\Html;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Path\CurrentPathStack;
 use Drupal\Core\Render\Element\Checkboxes;
 use Drupal\Core\Url;
@@ -16,7 +17,7 @@
  *
  * @internal
  */
-class ViewsExposedForm extends FormBase {
+class ViewsExposedForm extends FormBase implements WorkspaceSafeFormInterface {
 
   /**
    * The exposed form cache.
diff --git a/core/modules/workspaces/src/Form/SwitchToLiveForm.php b/core/modules/workspaces/src/Form/SwitchToLiveForm.php
index 4cbc5f964cd84cd3b74722a72340b958b829c6c8..74ab6761043b5bebcfa33e6e8b049032ab1a3a2d 100644
--- a/core/modules/workspaces/src/Form/SwitchToLiveForm.php
+++ b/core/modules/workspaces/src/Form/SwitchToLiveForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Url;
 use Drupal\workspaces\WorkspaceManagerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -12,7 +13,7 @@
 /**
  * Provides a form that switches to the live version of the site.
  */
-class SwitchToLiveForm extends ConfirmFormBase implements WorkspaceFormInterface, ContainerInjectionInterface {
+class SwitchToLiveForm extends ConfirmFormBase implements ContainerInjectionInterface, WorkspaceSafeFormInterface {
 
   /**
    * The workspace manager.
diff --git a/core/modules/workspaces/src/Form/WorkspaceActivateForm.php b/core/modules/workspaces/src/Form/WorkspaceActivateForm.php
index 83d48164b776623a27ed09d0a3c25c577ca7d6bf..56fee541ea2e1948376844bddaf2bf255ffba38b 100644
--- a/core/modules/workspaces/src/Form/WorkspaceActivateForm.php
+++ b/core/modules/workspaces/src/Form/WorkspaceActivateForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Entity\EntityConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\workspaces\WorkspaceAccessException;
@@ -14,7 +15,7 @@
 /**
  * Handle activation of a workspace on administrative pages.
  */
-class WorkspaceActivateForm extends EntityConfirmFormBase implements WorkspaceFormInterface {
+class WorkspaceActivateForm extends EntityConfirmFormBase implements WorkspaceSafeFormInterface {
 
   /**
    * The workspace entity.
diff --git a/core/modules/workspaces/src/Form/WorkspaceDeleteForm.php b/core/modules/workspaces/src/Form/WorkspaceDeleteForm.php
index c121e3cb1fc32ce736b847910394bc9c803d5cd1..4fdb1b69125834cd2508218fd7d3e6d71eb5b1c6 100644
--- a/core/modules/workspaces/src/Form/WorkspaceDeleteForm.php
+++ b/core/modules/workspaces/src/Form/WorkspaceDeleteForm.php
@@ -16,7 +16,7 @@
  *
  * @internal
  */
-class WorkspaceDeleteForm extends ContentEntityDeleteForm implements WorkspaceFormInterface {
+class WorkspaceDeleteForm extends ContentEntityDeleteForm {
 
   /**
    * The workspace entity.
diff --git a/core/modules/workspaces/src/Form/WorkspaceForm.php b/core/modules/workspaces/src/Form/WorkspaceForm.php
index 8fb6b34ec9319f05119c2a51622b0bb1dea8109e..97e3cb0aa1d59b1bdab43d306d8dd55d2f0c3179 100644
--- a/core/modules/workspaces/src/Form/WorkspaceForm.php
+++ b/core/modules/workspaces/src/Form/WorkspaceForm.php
@@ -12,7 +12,7 @@
 /**
  * Form controller for the workspace edit forms.
  */
-class WorkspaceForm extends ContentEntityForm implements WorkspaceFormInterface {
+class WorkspaceForm extends ContentEntityForm {
 
   /**
    * The workspace entity.
diff --git a/core/modules/workspaces/src/Form/WorkspaceFormInterface.php b/core/modules/workspaces/src/Form/WorkspaceFormInterface.php
index 53f82fa4f27cc0d58a3fe6a8745c2534b06de032..8478115a7bdfcc3845bebd1bbd27edb6fa0a6536 100644
--- a/core/modules/workspaces/src/Form/WorkspaceFormInterface.php
+++ b/core/modules/workspaces/src/Form/WorkspaceFormInterface.php
@@ -8,5 +8,11 @@
  * Defines interface for workspace forms so they can be easily distinguished.
  *
  * @internal
+ *
+ * @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use
+ *   \Drupal\Core\Form\WorkspaceSafeFormInterface or
+ *   \Drupal\Core\Form\WorkspaceDynamicSafeFormInterface instead.
+ *
+ * @see https://www.drupal.org/node/3229111
  */
 interface WorkspaceFormInterface extends FormInterface {}
diff --git a/core/modules/workspaces/src/Form/WorkspaceMergeForm.php b/core/modules/workspaces/src/Form/WorkspaceMergeForm.php
index e447abcaf916edd7e0321133694b10e6592cdef6..046a1a13d78dad4eb8b3021e5f3aa974f16c4934 100644
--- a/core/modules/workspaces/src/Form/WorkspaceMergeForm.php
+++ b/core/modules/workspaces/src/Form/WorkspaceMergeForm.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Url;
 use Drupal\workspaces\WorkspaceInterface;
 use Drupal\workspaces\WorkspaceOperationFactory;
@@ -14,7 +15,7 @@
 /**
  * Provides a form that merges the contents for a workspace into another one.
  */
-class WorkspaceMergeForm extends ConfirmFormBase implements WorkspaceFormInterface, ContainerInjectionInterface {
+class WorkspaceMergeForm extends ConfirmFormBase implements ContainerInjectionInterface, WorkspaceSafeFormInterface {
 
   /**
    * The source workspace entity.
diff --git a/core/modules/workspaces/src/Form/WorkspacePublishForm.php b/core/modules/workspaces/src/Form/WorkspacePublishForm.php
index 077e1c857a6646de810bf5a1b02e7d5f15d1d8a2..35570089bab8c104e2dee155868ea1ab7fe7b06a 100644
--- a/core/modules/workspaces/src/Form/WorkspacePublishForm.php
+++ b/core/modules/workspaces/src/Form/WorkspacePublishForm.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Url;
 use Drupal\workspaces\WorkspaceAccessException;
 use Drupal\workspaces\WorkspaceInterface;
@@ -15,7 +16,7 @@
 /**
  * Provides the workspace publishing form.
  */
-class WorkspacePublishForm extends ConfirmFormBase implements WorkspaceFormInterface, ContainerInjectionInterface {
+class WorkspacePublishForm extends ConfirmFormBase implements ContainerInjectionInterface, WorkspaceSafeFormInterface {
 
   /**
    * The workspace that will be published.
diff --git a/core/modules/workspaces/src/Form/WorkspaceSwitcherForm.php b/core/modules/workspaces/src/Form/WorkspaceSwitcherForm.php
index 186aed1b78a76f05f49786f1b7228ab6186a67fe..bfde0f4631c7239043b3a67001104281ef972078 100644
--- a/core/modules/workspaces/src/Form/WorkspaceSwitcherForm.php
+++ b/core/modules/workspaces/src/Form/WorkspaceSwitcherForm.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Messenger\MessengerInterface;
 use Drupal\workspaces\WorkspaceAccessException;
 use Drupal\workspaces\WorkspaceManagerInterface;
@@ -13,7 +14,7 @@
 /**
  * Provides a form that activates a different workspace.
  */
-class WorkspaceSwitcherForm extends FormBase implements WorkspaceFormInterface {
+class WorkspaceSwitcherForm extends FormBase implements WorkspaceSafeFormInterface {
 
   /**
    * The workspace manager.
diff --git a/core/modules/workspaces/src/FormOperations.php b/core/modules/workspaces/src/FormOperations.php
index 36493abaa41a412d99caa8844c6c79da7b5d9ac2..6d06ec6aa058906887e5d82c4678e000bd5c0e40 100644
--- a/core/modules/workspaces/src/FormOperations.php
+++ b/core/modules/workspaces/src/FormOperations.php
@@ -4,10 +4,10 @@
 
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\WorkspaceDynamicSafeFormInterface;
+use Drupal\Core\Form\WorkspaceSafeFormInterface;
 use Drupal\Core\Render\Element;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
-use Drupal\views\Form\ViewsExposedForm;
-use Drupal\workspaces\Form\WorkspaceFormInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -61,28 +61,18 @@ public function formAlter(array &$form, FormStateInterface $form_state, $form_id
       return;
     }
 
-    // Add an additional validation step for every form if we are in a
-    // non-default workspace.
+    // Add a validation step for every form if we are in a workspace.
     $this->addWorkspaceValidation($form);
 
     // If a form has already been marked as safe or not to submit in a
-    // non-default workspace, we don't have anything else to do.
+    // workspace, we don't have anything else to do.
     if ($form_state->has('workspace_safe')) {
       return;
     }
 
-    // No forms are safe to submit in a non-default workspace by default, except
-    // for the whitelisted ones defined below.
-    $workspace_safe = FALSE;
-
-    // Whitelist a few forms that we know are safe to submit.
     $form_object = $form_state->getFormObject();
-    $is_workspace_form = $form_object instanceof WorkspaceFormInterface;
-    $is_search_form = in_array($form_object->getFormId(), ['search_block_form', 'search_form'], TRUE);
-    $is_views_exposed_form = $form_object instanceof ViewsExposedForm;
-    if ($is_workspace_form || $is_search_form || $is_views_exposed_form) {
-      $workspace_safe = TRUE;
-    }
+    $workspace_safe = $form_object instanceof WorkspaceSafeFormInterface
+      || ($form_object instanceof WorkspaceDynamicSafeFormInterface && $form_object->isWorkspaceSafeForm($form, $form_state));
 
     $form_state->set('workspace_safe', $workspace_safe);
   }