diff --git a/core/misc/announce.js b/core/misc/announce.js index 7425a43..cd1ee5b 100644 --- a/core/misc/announce.js +++ b/core/misc/announce.js @@ -101,9 +101,9 @@ * messages. These messages are then joined and append to the aria-live region * as one text node. * - * @param {String} text + * @param {string} text * A string to be read by the UA. - * @param {String} priority + * @param {string} priority * A string to indicate the priority of the message. Can be either * 'polite' or 'assertive'. * @@ -119,5 +119,8 @@ }); debouncedProcessAnnounce(announcements); } + else { + throw new Error(Drupal.t('"text" passed Drupal.announce must be a string.')); + } }; }(Drupal, Drupal.debounce)); diff --git a/core/misc/message.js b/core/misc/message.js index 9505ad3..50e8ec4 100644 --- a/core/misc/message.js +++ b/core/misc/message.js @@ -69,7 +69,7 @@ text: message, type: type || 'status' }); - debouncedProcessMessages(messages); + debouncedProcessMessages(); } }; @@ -80,12 +80,13 @@ * The message context to remove * @param {string} type * Message type, can be either 'status', 'error' or 'warning'. - * Default to 'status' */ Drupal.message.remove = function (context, type) { - context = context || 'default'; - type = type || 'status'; - $('.messages--' + type + '.js-messages-context--' + context).remove(); + var selector = '.js-messages-context--' + (context || 'default'); + if (type) { + selector = '.messages--' + (type || 'status') + selector; + } + $(selector).remove(); }; /** diff --git a/core/modules/system/tests/modules/js_message_test/js/js_message_test.js b/core/modules/system/tests/modules/js_message_test/js/js_message_test.js index 576916f..b38a1c2 100644 --- a/core/modules/system/tests/modules/js_message_test/js/js_message_test.js +++ b/core/modules/system/tests/modules/js_message_test/js/js_message_test.js @@ -19,7 +19,7 @@ e.preventDefault(); var type = e.currentTarget.getAttribute('data-type'); var context = e.currentTarget.getAttribute('data-context'); - message.add('Msg-' + type + '-' + context, type, context); + message.add('Msg-' + context + '-' + type, type, context); }); $('.remove-link').once('remove-msg').on('click', function (e) { e.preventDefault(); @@ -30,7 +30,7 @@ $('.show-multiple').once('show-msg').on('click', function (e) { e.preventDefault(); for (var i = 0; i < 10; i++) { - message.add('Msg-' + i, 'default', 'context-' + i); + message.add('Msg-' + i, 'status', 'context-' + i); } }); diff --git a/core/modules/system/tests/modules/js_message_test/src/Controller/JSMessageTestController.php b/core/modules/system/tests/modules/js_message_test/src/Controller/JSMessageTestController.php index ce25516..239d4ef 100644 --- a/core/modules/system/tests/modules/js_message_test/src/Controller/JSMessageTestController.php +++ b/core/modules/system/tests/modules/js_message_test/src/Controller/JSMessageTestController.php @@ -40,6 +40,15 @@ public function messageLinks() { ], ]; } + $links["remove-$context"] = [ + 'title' => "Remove-$context-all", + 'url' => Url::fromRoute('js_message_test.links'), + 'attributes' => [ + 'id' => "remove-$context", + 'data-context' => $context, + 'class' => ['remove-link'], + ], + ]; } $links['show-multi'] = [ 'title' => "Show Multiple", diff --git a/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php b/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php index 1893879..0387b01 100644 --- a/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php +++ b/core/tests/Drupal/FunctionalJavascriptTests/Core/JsMessageTest.php @@ -48,31 +48,48 @@ public function testAddRemoveMessages() { $selector = ".messages.messages--$type.js-messages.js-messages-context--$context"; $msg_element = $web_assert->waitForElementVisible('css', $selector); $this->assertNotEmpty($msg_element, "Message element visible: $selector"); - $web_assert->elementContains('css', $selector, "Msg-$type-$context"); + $web_assert->elementContains('css', $selector, "Msg-$context-$type"); // Click all remove links except the one that will remove the message. $this->clickAllRemoveLinksExcept($context, $type); // Confirm the message was not removed. - $web_assert->elementContains('css', $selector, "Msg-$type-$context"); + $web_assert->elementContains('css', $selector, "Msg-$context-$type"); // Click the remove links that should remove the message. $this->clickLink("Remove-$context-$type"); $web_assert->elementNotExists('css', $selector); } } + // Test removing all messages of a specific context. + $this->clickLink("Show-context1-error"); + $this->clickLink("Show-context2-error"); + $this->clickLink("Show-context1-warning"); + $this->clickLink("Show-context2-warning"); + $this->waitForMessageElement('warning', 'context2'); + $this->assertCurrentMessages([ + 'Msg-context1-error', + 'Msg-context2-error', + 'Msg-context1-warning', + 'Msg-context2-warning', + ]); + $this->clickLink('Remove-context1-all'); + $web_assert->assertWaitOnAjaxRequest(); + $this->assertCurrentMessages([ + 'Msg-context2-error', + 'Msg-context2-warning', + ]); + $this->clickLink('Remove-context2-all'); + $this->assertCurrentMessages([]); + // Test adding multiple messages at once. // @see processMessages() $this->clickLink('Show Multiple'); - $message_number = 0; - $last_msg_element = $web_assert->waitForElementVisible('css', '.messages.messages--default.js-messages.js-messages-context--context-9'); - $this->assertNotEmpty($last_msg_element, "Last message element visible."); - $message_divs = $this->getSession()->getPage()->findAll('css', '.messages'); - $this->assertEquals(10, count($message_divs), 'All messages shown'); + $this->waitForMessageElement('default', 'context-9'); - foreach ($message_divs as $message_div) { - /** @var \Behat\Mink\Element\NodeElement $message_div */ - $this->assertEquals("Msg-$message_number", $message_div->getText()); - $message_number++; + $current_messages = []; + for ($i = 0; $i < 10; $i++) { + $current_messages[] = "Msg-$i"; } + $this->assertCurrentMessages($current_messages); } /** @@ -93,4 +110,33 @@ protected function clickAllRemoveLinksExcept($exclude_context, $exclude_type) { } } + /** + * Asserts that currently shown messages match expected messages. + * + * @param array $expected_messages + * Expected messages. + */ + private function assertCurrentMessages($expected_messages) { + $current_messages = []; + $message_divs = $this->getSession()->getPage()->findAll('css', '.messages'); + foreach ($message_divs as $message_div) { + /** @var \Behat\Mink\Element\NodeElement $message_div */ + $current_messages[] = $message_div->getText(); + } + $this->assertEquals($expected_messages, $current_messages); + } + + /** + * Waits for an element message to be visible. + * + * @param string $type + * The type of the message. + * @param string $context + * The context of the message. + */ + protected function waitForMessageElement($type, $context) { + $last_msg_element = $this->assertSession()->waitForElementVisible('css', ".messages.messages--$type.js-messages.js-messages-context--$context"); + $this->assertNotEmpty($last_msg_element, "Message element visible."); + } + }