diff --git a/core/lib/Drupal/Core/Installer/InstallerServiceProvider.php b/core/lib/Drupal/Core/Installer/InstallerServiceProvider.php index 6e93561..37b2181 100644 --- a/core/lib/Drupal/Core/Installer/InstallerServiceProvider.php +++ b/core/lib/Drupal/Core/Installer/InstallerServiceProvider.php @@ -39,6 +39,9 @@ public function register(ContainerBuilder $container) { ->register('keyvalue', 'Drupal\Core\KeyValueStore\KeyValueMemoryFactory'); $container ->register('keyvalue.expirable', 'Drupal\Core\KeyValueStore\KeyValueNullExpirableFactory'); + $definition = $container->getDefinition('messenger'); + $definition->setClass('Drupal\Core\Messenger\StaticMessenger'); + $definition->setArguments(array('@page_cache_kill_switch')); // Replace services with no-op implementations. $container diff --git a/core/lib/Drupal/Core/Messenger/StaticMessenger.php b/core/lib/Drupal/Core/Messenger/StaticMessenger.php new file mode 100644 index 0000000..97b1fc0 --- /dev/null +++ b/core/lib/Drupal/Core/Messenger/StaticMessenger.php @@ -0,0 +1,120 @@ +pageCacheKillSwitch = $page_cache_kill_switch; + } + + /** + * {@inheritdoc} + */ + public function addMessage($message, $type = self::STATUS, $repeat = FALSE) { + if ($repeat || !array_key_exists($type, $this->messages) || !in_array($message, $this->messages[$type])) { + $this->messages[$type][] = array( + 'safe' => SafeMarkup::isSafe($message), + 'message' => $message, + ); + $this->pageCacheKillSwitch->trigger(); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getMessages() { + $messages = isset($this->messages) ? $this->messages : array(); + foreach ($messages as $type => $messages_by_type) { + $messages[$type] = $this->processMessages($messages_by_type); + } + + return $messages; + } + + /** + * {@inheritdoc} + */ + public function getMessagesByType($type) { + $messages = isset($this->messages) && isset($this->messages[$type]) ? $this->messages[$type] : array(); + + return $this->processMessages($messages); + } + + /** + * {@inheritdoc} + */ + public function deleteMessages() { + unset($this->messages); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function deleteMessagesByType($type) { + unset($this->messages[$type]); + + return $this; + } + + /** + * Processes safe markup. + * + * @param array[] + * An array of arrays with the following keys: + * - message: the message string. + * - safe: a boolean indicating whether the message contains safe markup. + * + * @return string[] + * The messages. + */ + protected function processMessages(array $messages) { + $processed_messages = array(); + foreach ($messages as $message_data) { + $processed_messages[] = $message_data['safe'] ? SafeMarkup::set($message_data['message']) : $message_data['message']; + } + + return $processed_messages; + } + +} diff --git a/core/tests/Drupal/Tests/Core/Messenger/StaticMessengerTest.php b/core/tests/Drupal/Tests/Core/Messenger/StaticMessengerTest.php new file mode 100644 index 0000000..6f44600 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Messenger/StaticMessengerTest.php @@ -0,0 +1,97 @@ + '', + 'name' => '\Drupal\Core\Messenger\Messenger unit test', + 'group' => 'Messenger', + ); + } + + /** + * {@inheritdoc} + * + * @covers ::__construct + */ + public function setUp() { + $this->pageCacheKillSwitch = $this->getMockBuilder('\Drupal\Core\PageCache\ResponsePolicy\KillSwitch') + ->disableOriginalConstructor() + ->getMock(); + + $this->messenger = new StaticMessenger($this->pageCacheKillSwitch); + } + + /** + * @covers ::addMessage + * @covers ::getMessages + * @covers ::getMessagesByType + * @covers ::deleteMessages + * @covers ::deleteMessagesByType + */ + public function testMessenger() { + $message_a = $this->randomMachineName(); + $type_a = $this->randomMachineName(); + $message_b = $this->randomMachineName(); + $type_b = $this->randomMachineName(); + + $this->pageCacheKillSwitch->expects($this->atLeastOnce()) + ->method('trigger'); + + // Test that if there are no messages, the default is an empty array. + $this->assertEquals($this->messenger->getMessages(), array()); + + // Test that adding a message returns the messenger and that the message can + // be retrieved. + $this->assertEquals($this->messenger->addMessage($message_a, $type_a), $this->messenger); + $this->messenger->addMessage($message_a, $type_a); + $this->messenger->addMessage($message_a, $type_a, TRUE); + $this->messenger->addMessage($message_b, $type_b, TRUE); + $this->assertEquals($this->messenger->getMessages(), array( + $type_a => array($message_a, $message_a, $message_a), + $type_b => array($message_b), + )); + + // Test deleting messages of a certain type. + $this->assertEquals($this->messenger->deleteMessagesByType($type_a), $this->messenger); + $this->assertEquals($this->messenger->getMessages(), array( + $type_b => array($message_b), + )); + + // Test deleting all messages. + $this->assertEquals($this->messenger->deleteMessages(), $this->messenger); + $this->assertEquals($this->messenger->getMessages(), array()); + } + +}