diff --git a/core/modules/media/src/MediaForm.php b/core/modules/media/src/MediaForm.php index 6f860e23cdc0ddd4555b53c882009e3c6249d882..45cff5fdca5dfbf837ba20f4f448fd5908debeb8 100644 --- a/core/modules/media/src/MediaForm.php +++ b/core/modules/media/src/MediaForm.php @@ -59,9 +59,9 @@ public function form(array $form, FormStateInterface $form_state) { */ public function save(array $form, FormStateInterface $form_state) { $saved = parent::save($form, $form_state); - $context = ['@type' => $this->entity->bundle(), '%label' => $this->entity->label()]; + $context = ['@type' => $this->entity->bundle(), '%label' => $this->entity->label(), 'link' => $this->entity->toLink($this->t('View'))->toString()]; $logger = $this->logger('media'); - $t_args = ['@type' => $this->entity->bundle->entity->label(), '%label' => $this->entity->label()]; + $t_args = ['@type' => $this->entity->bundle->entity->label(), '%label' => $this->entity->toLink($this->entity->label())->toString()]; if ($saved === SAVED_NEW) { $logger->notice('@type: added %label.', $context); @@ -72,7 +72,16 @@ public function save(array $form, FormStateInterface $form_state) { $this->messenger()->addStatus($this->t('@type %label has been updated.', $t_args)); } - $form_state->setRedirectUrl($this->entity->toUrl('canonical')); + // Redirect the user to the media overview if the user has the 'access media + // overview' permission. If not, redirect to the canonical URL of the media + // item. + if ($this->currentUser()->hasPermission('access media overview')) { + $form_state->setRedirectUrl($this->entity->toUrl('collection')); + } + else { + $form_state->setRedirectUrl($this->entity->toUrl()); + } + return $saved; } diff --git a/core/modules/media/tests/src/Functional/MediaRevisionTest.php b/core/modules/media/tests/src/Functional/MediaRevisionTest.php index 9a8ce5a0bccd68d117b7bffc9e12189123922fa3..8291d2fcfd02cb96f815550a6ea99b4098ee9557 100644 --- a/core/modules/media/tests/src/Functional/MediaRevisionTest.php +++ b/core/modules/media/tests/src/Functional/MediaRevisionTest.php @@ -88,7 +88,7 @@ public function testFileMediaRevision() { $page->fillField('Name', 'Foobar'); $page->attachFileToField('File', $this->container->get('file_system')->realpath($uri)); $page->pressButton('Save'); - $assert->addressMatches('/^\/media\/[0-9]+$/'); + $assert->addressEquals('admin/content/media'); // The media item was just created, so it should only have one revision. $media = $this->container @@ -137,7 +137,7 @@ public function testImageMediaRevision() { $page->fillField('Name', 'Foobar'); $page->attachFileToField('Image', $this->root . '/core/modules/media/tests/fixtures/example_1.jpeg'); $page->pressButton('Save'); - $assert->addressMatches('/^\/media\/[0-9]+$/'); + $assert->addressEquals('admin/content/media'); // The media item was just created, so it should only have one revision. $media = $this->container diff --git a/core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php b/core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php index f45a33e30fcffc0a7787229dbab8e904b14f85ad..fe39fd828ebfe6d17d90c1a3b40d3a6ae0d6cedd 100644 --- a/core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php +++ b/core/modules/media/tests/src/Functional/MediaUiFunctionalTest.php @@ -71,6 +71,7 @@ public function testMediaWithOnlyOneMediaType() { ->loadUnchanged($media_id); $this->assertSame($media->getRevisionLogMessage(), $revision_log_message); $this->assertSame($media->getName(), $media_name); + $this->drupalGet('media/' . $media_id); $assert_session->titleEquals($media_name . ' | Drupal'); // Tests media edit form. @@ -87,6 +88,7 @@ public function testMediaWithOnlyOneMediaType() { ->getStorage('media') ->loadUnchanged($media_id); $this->assertSame($media->getName(), $media_name2); + $this->drupalGet('media/' . $media_id); $assert_session->titleEquals($media_name2 . ' | Drupal'); // Test that there is no empty vertical tabs element, if the container is @@ -113,6 +115,7 @@ public function testMediaWithOnlyOneMediaType() { $page->fillField('name[0][value]', $media_name); $page->fillField('revision_log_message[0][value]', $revision_log_message); $page->pressButton('Save'); + $this->drupalGet('media/' . $media_id); $assert_session->titleEquals($media_name . ' | Drupal'); /** @var \Drupal\media\MediaInterface $media */ $media = $this->container->get('entity_type.manager') @@ -433,6 +436,49 @@ public function testMediaReferenceWidget($cardinality, array $media_type_create_ } } + /** + * Tests the redirect URL after creating a media item. + */ + public function testMediaCreateRedirect() { + $session = $this->getSession(); + $page = $session->getPage(); + $assert_session = $this->assertSession(); + + $this->createMediaType('test', [ + 'queue_thumbnail_downloads' => FALSE, + ]); + + // Test a redirect to the media canonical URL for a user without the 'access + // media overview' permission. + $this->drupalLogin($this->drupalCreateUser([ + 'view media', + 'create media', + ])); + $this->drupalGet('media/add'); + $page->fillField('name[0][value]', $this->randomMachineName()); + $page->fillField('field_media_test[0][value]', $this->randomString()); + $page->pressButton('Save'); + $media_id = $this->container->get('entity_type.manager') + ->getStorage('media') + ->getQuery() + ->execute(); + $media_id = reset($media_id); + $assert_session->addressEquals('media/' . $media_id); + + // Test a redirect to the media overview for a user with the 'access media + // overview' permission. + $this->drupalLogin($this->drupalCreateUser([ + 'view media', + 'create media', + 'access media overview', + ])); + $this->drupalGet('media/add'); + $page->fillField('name[0][value]', $this->randomMachineName()); + $page->fillField('field_media_test[0][value]', $this->randomString()); + $page->pressButton('Save'); + $assert_session->addressEquals('admin/content/media'); + } + /** * Asserts that the given texts are present exactly once. * diff --git a/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php b/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php index 591643b1696b4bfefbb204d30b8fe64c8c65115f..19ebf9dc2cdc2010669fe4cdcfe0ad21d2617f42 100644 --- a/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php +++ b/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php @@ -83,6 +83,9 @@ public function testMediaDisplay() { ->execute(); $image_media_id = reset($image_media_id); + // Go to the media entity view. + $this->drupalGet('/media/' . $image_media_id); + // Here we expect to see only the image, nothing else. // Assert only one element in the content region. $this->assertSame(1, count($page->findAll('css', '.media--type-image > div'))); @@ -104,6 +107,9 @@ public function testMediaDisplay() { $this->assertNotEmpty($result); $page->pressButton('Save'); + // Go to the media entity view. + $this->drupalGet($this->assertLinkToCreatedMedia()); + // Here we expect to see only the linked filename. // Assert only one element in the content region. $this->assertSame(1, count($page->findAll('css', 'article.media--type-file > div'))); diff --git a/core/modules/media/tests/src/FunctionalJavascript/MediaJavascriptTestBase.php b/core/modules/media/tests/src/FunctionalJavascript/MediaJavascriptTestBase.php index f8c04d17b6e3ff05144785adc251c51da9241018..390e22075ab8f815a49aa0816cf82a5a7f1e7372 100644 --- a/core/modules/media/tests/src/FunctionalJavascript/MediaJavascriptTestBase.php +++ b/core/modules/media/tests/src/FunctionalJavascript/MediaJavascriptTestBase.php @@ -43,4 +43,21 @@ protected function waitUntilVisible($selector, $timeout = 1000, $message = '') { $this->assertJsCondition($condition, $timeout, $message); } + /** + * Asserts that a link to a new media item is displayed in the messages area. + * + * @return string + * The link URL. + */ + protected function assertLinkToCreatedMedia() { + $assert_session = $this->assertSession(); + $selector = '.messages a'; + + // Get the canonical media entity URL from the creation message. + $link = $assert_session->elementExists('css', $selector); + $assert_session->elementAttributeExists('css', $selector, 'href'); + + return $link->getAttribute('href'); + } + } diff --git a/core/modules/media/tests/src/FunctionalJavascript/MediaSourceAudioVideoTest.php b/core/modules/media/tests/src/FunctionalJavascript/MediaSourceAudioVideoTest.php index 4ad3c5be08e85e507ccf3f32d220d01217c652a5..2195f74b3443bb9a94ec3d6099f443ddf9ec1750 100644 --- a/core/modules/media/tests/src/FunctionalJavascript/MediaSourceAudioVideoTest.php +++ b/core/modules/media/tests/src/FunctionalJavascript/MediaSourceAudioVideoTest.php @@ -39,7 +39,7 @@ public function testAudioTypeCreation() { $formatter = $display->getComponent($field_name)['type']; $this->assertSame('file_audio', $formatter); - // Create a media asset and verify that the