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