From 30c286f45d607fdad29c48bc3436711b68e9497a Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Fri, 12 Jun 2020 08:25:45 +0100
Subject: [PATCH] Issue #2946750 by Sam152, merauluka, timmillwood, catch: Node
 revisions forced even if bundle not under moderation workflow

---
 .../content_moderation/src/EntityTypeInfo.php | 43 +++++++++----------
 .../ModerationStateNodeTypeTest.php           |  9 ++++
 .../Functional/ModerationStateTestBase.php    |  4 --
 3 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/core/modules/content_moderation/src/EntityTypeInfo.php b/core/modules/content_moderation/src/EntityTypeInfo.php
index 363ecaac9196..00ddda2dfcda 100644
--- a/core/modules/content_moderation/src/EntityTypeInfo.php
+++ b/core/modules/content_moderation/src/EntityTypeInfo.php
@@ -321,37 +321,36 @@ public function entityPrepareForm(EntityInterface $entity, $operation, FormState
   public function formAlter(array &$form, FormStateInterface $form_state, $form_id) {
     $form_object = $form_state->getFormObject();
     if ($form_object instanceof BundleEntityFormBase) {
-      $config_entity_type = $form_object->getEntity()->getEntityType();
-      $bundle_of = $config_entity_type->getBundleOf();
+      $config_entity = $form_object->getEntity();
+      $bundle_of = $config_entity->getEntityType()->getBundleOf();
       if ($bundle_of
           && ($bundle_of_entity_type = $this->entityTypeManager->getDefinition($bundle_of))
-          && $this->moderationInfo->canModerateEntitiesOfEntityType($bundle_of_entity_type)) {
-        $this->entityTypeManager->getHandler($config_entity_type->getBundleOf(), 'moderation')->enforceRevisionsBundleFormAlter($form, $form_state, $form_id);
+          && $this->moderationInfo->shouldModerateEntitiesOfBundle($bundle_of_entity_type, $config_entity->id())) {
+        $this->entityTypeManager->getHandler($bundle_of, 'moderation')->enforceRevisionsBundleFormAlter($form, $form_state, $form_id);
       }
     }
     elseif ($this->isModeratedEntityEditForm($form_object)) {
       /** @var \Drupal\Core\Entity\ContentEntityFormInterface $form_object */
       /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
       $entity = $form_object->getEntity();
-      if ($this->moderationInfo->isModeratedEntity($entity)) {
-        $this->entityTypeManager
-          ->getHandler($entity->getEntityTypeId(), 'moderation')
-          ->enforceRevisionsEntityFormAlter($form, $form_state, $form_id);
-
-        // Submit handler to redirect to the latest version, if available.
-        $form['actions']['submit']['#submit'][] = [EntityTypeInfo::class, 'bundleFormRedirect'];
-
-        // Move the 'moderation_state' field widget to the footer region, if
-        // available.
-        if (isset($form['footer']) && in_array($form_object->getOperation(), ['edit', 'default'], TRUE)) {
-          $form['moderation_state']['#group'] = 'footer';
-        }
 
-        // If the publishing status exists in the meta region, replace it with
-        // the current state instead.
-        if (isset($form['meta']['published'])) {
-          $form['meta']['published']['#markup'] = $this->moderationInfo->getWorkflowForEntity($entity)->getTypePlugin()->getState($entity->moderation_state->value)->label();
-        }
+      $this->entityTypeManager
+        ->getHandler($entity->getEntityTypeId(), 'moderation')
+        ->enforceRevisionsEntityFormAlter($form, $form_state, $form_id);
+
+      // Submit handler to redirect to the latest version, if available.
+      $form['actions']['submit']['#submit'][] = [EntityTypeInfo::class, 'bundleFormRedirect'];
+
+      // Move the 'moderation_state' field widget to the footer region, if
+      // available.
+      if (isset($form['footer']) && in_array($form_object->getOperation(), ['edit', 'default'], TRUE)) {
+        $form['moderation_state']['#group'] = 'footer';
+      }
+
+      // If the publishing status exists in the meta region, replace it with
+      // the current state instead.
+      if (isset($form['meta']['published'])) {
+        $form['meta']['published']['#markup'] = $this->moderationInfo->getWorkflowForEntity($entity)->getTypePlugin()->getState($entity->moderation_state->value)->label();
       }
     }
   }
diff --git a/core/modules/content_moderation/tests/src/Functional/ModerationStateNodeTypeTest.php b/core/modules/content_moderation/tests/src/Functional/ModerationStateNodeTypeTest.php
index 8999dae1229b..5c4b70a4e21d 100644
--- a/core/modules/content_moderation/tests/src/Functional/ModerationStateNodeTypeTest.php
+++ b/core/modules/content_moderation/tests/src/Functional/ModerationStateNodeTypeTest.php
@@ -67,9 +67,18 @@ public function testEnablingOnExistingContent() {
     ], t('Save'));
     $this->assertText('Not moderated Test has been created.');
 
+    // Check that the 'Create new revision' is not disabled.
+    $this->drupalGet('/admin/structure/types/manage/not_moderated');
+    $this->assertNull($this->assertSession()->fieldExists('options[revision]')->getAttribute('disabled'));
+
     // Now enable moderation state.
     $this->enableModerationThroughUi('not_moderated');
 
+    // Check that the 'Create new revision' checkbox is checked and disabled.
+    $this->drupalGet('/admin/structure/types/manage/not_moderated');
+    $this->assertSession()->checkboxChecked('options[revision]');
+    $this->assertSession()->fieldDisabled('options[revision]');
+
     // And make sure it works.
     $nodes = \Drupal::entityTypeManager()->getStorage('node')
       ->loadByProperties(['title' => 'Test']);
diff --git a/core/modules/content_moderation/tests/src/Functional/ModerationStateTestBase.php b/core/modules/content_moderation/tests/src/Functional/ModerationStateTestBase.php
index 5c7c68e34da4..fc0433eb03d9 100644
--- a/core/modules/content_moderation/tests/src/Functional/ModerationStateTestBase.php
+++ b/core/modules/content_moderation/tests/src/Functional/ModerationStateTestBase.php
@@ -112,10 +112,6 @@ protected function createContentTypeFromUi($content_type_name, $content_type_id,
     $this->drupalGet('admin/structure/types');
     $this->clickLink('Add content type');
 
-    // Check that the 'Create new revision' checkbox is checked and disabled.
-    $this->assertSession()->checkboxChecked('options[revision]');
-    $this->assertSession()->fieldDisabled('options[revision]');
-
     $edit = [
       'name' => $content_type_name,
       'type' => $content_type_id,
-- 
GitLab