From 86746fce082a6d845a585933bce1a85ebd2d24a3 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Tue, 27 Feb 2018 22:46:58 +0000
Subject: [PATCH] Issue #2940513 by Sam152, Berdir:
 ModerationStateFieldItemList fails after an entity has been
 serialized/unserialized

---
 .../src/Plugin/Field/ModerationStateFieldItemList.php |  5 ++++-
 .../src/Kernel/ModerationStateFieldItemListTest.php   | 11 +++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
index 1256bf27f4c8..8d48f26ae478 100644
--- a/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
+++ b/core/modules/content_moderation/src/Plugin/Field/ModerationStateFieldItemList.php
@@ -141,7 +141,10 @@ public function onChange($delta) {
   public function setValue($values, $notify = TRUE) {
     parent::setValue($values, $notify);
 
-    if (isset($this->list[0])) {
+    // If the parent created a field item and if the parent should be notified
+    // about the change (e.g. this is not initialized with the current value),
+    // update the moderated entity.
+    if (isset($this->list[0]) && $notify) {
       $this->valueComputed = TRUE;
       $this->updateModeratedEntity($this->list[0]->value);
     }
diff --git a/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php b/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php
index 7d95054f0c0c..c4770166408c 100644
--- a/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php
+++ b/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php
@@ -173,4 +173,15 @@ public function testEntityWithNoWorkflow() {
     $this->assertTrue($test_node->isPublished());
   }
 
+  /**
+   * Test the moderation_state field after an entity has been serialized.
+   */
+  public function testEntityUnserialize() {
+    $this->testNode->moderation_state->value = 'draft';
+    $unserialized = unserialize(serialize($this->testNode));
+
+    $this->assertEquals('Test title', $unserialized->title->value);
+    $this->assertEquals('draft', $unserialized->moderation_state->value);
+  }
+
 }
-- 
GitLab