From ff4351abae65d71abb815188d7764050142cf34d Mon Sep 17 00:00:00 2001 From: webchick <drupal@webchick.net> Date: Wed, 20 Nov 2019 22:39:10 -0800 Subject: [PATCH] Issue #3094059 by Sam152, seanB, phenaproxima, oknate, 5n00py, andrewmacpherson, matthieuscarset, dion-jensen: The media library widget "Add media" button incorrectly submits form handlers of forms it is embedded in --- .../Field/FieldWidget/MediaLibraryWidget.php | 3 +-- .../media_library_test.module | 11 +++++++++ .../src/Form/TestNodeFormOverride.php | 24 +++++++++++++++++++ .../FunctionalJavascript/MediaLibraryTest.php | 6 +++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 core/modules/media_library/tests/modules/media_library_test/src/Form/TestNodeFormOverride.php diff --git a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php index 5234c88d90db..453d6180654a 100644 --- a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php +++ b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php @@ -478,7 +478,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen // Add a button that will load the Media library in a modal using AJAX. $element['open_button'] = [ - '#type' => 'submit', + '#type' => 'button', '#value' => $this->t('Add media'), '#name' => $field_name . '-media-library-open-button' . $id_suffix, '#attributes' => [ @@ -497,7 +497,6 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen 'message' => $this->t('Opening media library.'), ], ], - '#submit' => [], // Allow the media library to be opened even if there are form errors. '#limit_validation_errors' => [], ]; diff --git a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module index 3d9576bc1a49..6c001f977138 100644 --- a/core/modules/media_library/tests/modules/media_library_test/media_library_test.module +++ b/core/modules/media_library/tests/modules/media_library_test/media_library_test.module @@ -9,6 +9,7 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\media_library_test\Form\TestNodeFormOverride; /** * Implements hook_entity_field_access(). @@ -16,3 +17,13 @@ function media_library_test_entity_field_access($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { return AccessResult::forbiddenIf($field_definition->getName() === 'field_media_no_access', 'Field access denied by test module'); } + +/** + * Implements hook_entity_type_alter(). + */ +function media_library_test_entity_type_alter(array &$entity_types) { + if (isset($entity_types['node'])) { + $entity_types['node']->setFormClass('default', TestNodeFormOverride::class); + $entity_types['node']->setFormClass('edit', TestNodeFormOverride::class); + } +} diff --git a/core/modules/media_library/tests/modules/media_library_test/src/Form/TestNodeFormOverride.php b/core/modules/media_library/tests/modules/media_library_test/src/Form/TestNodeFormOverride.php new file mode 100644 index 000000000000..d95c4cda6746 --- /dev/null +++ b/core/modules/media_library/tests/modules/media_library_test/src/Form/TestNodeFormOverride.php @@ -0,0 +1,24 @@ +<?php + +namespace Drupal\media_library_test\Form; + +use Drupal\Core\Form\FormStateInterface; +use Drupal\node\NodeForm; + +/** + * Override NodeForm to test media library form submission semantics. + */ +class TestNodeFormOverride extends NodeForm { + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $triggering_element = $form_state->getTriggeringElement(); + if (in_array('open_button', $triggering_element['#parents'], TRUE)) { + throw new \Exception('The media library widget open_button element should not trigger form submit.'); + } + parent::submitForm($form, $form_state); + } + +} diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php index 649b16f52527..98193befdb3f 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php @@ -480,6 +480,12 @@ public function testWidget() { // setting for the entity reference field is null. All types should be // allowed in this case. $menu = $this->openMediaLibraryForField('field_null_types_media'); + + // Assert that the button to open the media library does not submit the + // parent form. We can do this by checking if the validation of the parent + // form is not triggered. + $assert_session->pageTextNotContains('Title field is required.'); + $this->assertTrue($menu->hasLink('Type One')); $this->assertTrue($menu->hasLink('Type Two')); $this->assertTrue($menu->hasLink('Type Three')); -- GitLab