diff --git a/core/modules/media_library/src/Form/AddFormBase.php b/core/modules/media_library/src/Form/AddFormBase.php index db5d6a7fcb..45c1a8f0f4 100644 --- a/core/modules/media_library/src/Form/AddFormBase.php +++ b/core/modules/media_library/src/Form/AddFormBase.php @@ -13,6 +13,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; use Drupal\file\FileInterface; +use Drupal\file\FileUsage\FileUsageInterface; use Drupal\media\MediaInterface; use Drupal\media\MediaTypeInterface; use Drupal\media_library\Ajax\UpdateSelectionCommand; @@ -65,6 +66,13 @@ abstract class AddFormBase extends FormBase { */ protected $openerResolver; + /** + * The file usage service. + * + * @var \Drupal\file\FileUsage\FileUsageInterface + */ + protected $fileUsage; + /** * Constructs a AddFormBase object. * @@ -74,8 +82,10 @@ abstract class AddFormBase extends FormBase { * The media library UI builder. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. + * @param \Drupal\file\FileUsage\FileUsageInterface $file_usage + * The file usage service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, OpenerResolverInterface $opener_resolver = NULL) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, OpenerResolverInterface $opener_resolver = NULL, FileUsageInterface $file_usage = NULL) { $this->entityTypeManager = $entity_type_manager; $this->libraryUiBuilder = $library_ui_builder; $this->viewBuilder = $this->entityTypeManager->getViewBuilder('media'); @@ -84,6 +94,11 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Med $opener_resolver = \Drupal::service('media_library.opener_resolver'); } $this->openerResolver = $opener_resolver; + if (!$file_usage) { + @trigger_error('The file.usage service must be passed to AddFormBase::__construct(), it is required before Drupal 9.0.0.', E_USER_DEPRECATED); + $file_usage = \Drupal::service('file.usage'); + } + $this->fileUsage = $file_usage; } /** @@ -563,7 +578,7 @@ public function removeButtonSubmit(array $form, FormStateInterface $form_state) // Immediately discard its file. $file = $removed_media->get($this->getSourceFieldName($removed_media->bundle->entity))->entity; - if ($file instanceof FileInterface) { + if ($file instanceof FileInterface && empty($this->fileUsage->listUsage($file))) { $file->delete(); } diff --git a/core/modules/media_library/src/Form/FileUploadForm.php b/core/modules/media_library/src/Form/FileUploadForm.php index cfc85651e0..df4bf99b80 100644 --- a/core/modules/media_library/src/Form/FileUploadForm.php +++ b/core/modules/media_library/src/Form/FileUploadForm.php @@ -14,6 +14,7 @@ use Drupal\Core\Render\RendererInterface; use Drupal\Core\Url; use Drupal\file\FileInterface; +use Drupal\file\FileUsage\FileUsageInterface; use Drupal\file\Plugin\Field\FieldType\FileFieldItemList; use Drupal\file\Plugin\Field\FieldType\FileItem; use Drupal\media\MediaInterface; @@ -68,9 +69,11 @@ class FileUploadForm extends AddFormBase { * The file system service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. + * @param \Drupal\file\FileUsage\FileUsageInterface $file_usage + * The file usage service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system, OpenerResolverInterface $opener_resolver = NULL) { - parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); + public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system, OpenerResolverInterface $opener_resolver = NULL, FileUsageInterface $file_usage = NULL) { + parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver, $file_usage); $this->elementInfo = $element_info; $this->renderer = $renderer; $this->fileSystem = $file_system; diff --git a/core/modules/media_library/src/Form/OEmbedForm.php b/core/modules/media_library/src/Form/OEmbedForm.php index c31bc8e0dd..629c00c62a 100644 --- a/core/modules/media_library/src/Form/OEmbedForm.php +++ b/core/modules/media_library/src/Form/OEmbedForm.php @@ -6,6 +6,7 @@ use Drupal\Core\Form\FormBuilderInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Url; +use Drupal\file\FileUsage\FileUsageInterface; use Drupal\media\OEmbed\ResourceException; use Drupal\media\OEmbed\ResourceFetcherInterface; use Drupal\media\OEmbed\UrlResolverInterface; @@ -51,9 +52,11 @@ class OEmbedForm extends AddFormBase { * The oEmbed resource fetcher service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. + * @param \Drupal\file\FileUsage\FileUsageInterface $file_usage + * The file usage service. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher, OpenerResolverInterface $opener_resolver = NULL) { - parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); + public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher, OpenerResolverInterface $opener_resolver = NULL, FileUsageInterface $file_usage = NULL) { + parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver, $file_usage); $this->urlResolver = $url_resolver; $this->resourceFetcher = $resource_fetcher; } @@ -67,7 +70,8 @@ public static function create(ContainerInterface $container) { $container->get('media_library.ui_builder'), $container->get('media.oembed.url_resolver'), $container->get('media.oembed.resource_fetcher'), - $container->get('media_library.opener_resolver') + $container->get('media_library.opener_resolver'), + $container->get('file.usage') ); } diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php index 5faf654b04..f751d5344b 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php @@ -1335,6 +1335,8 @@ public function testWidgetUpload() { // assert the field validation does not stop users from removing items. $page->fillField('media[0][fields][field_media_test_image][0][alt]', $filenames[0]); $page->fillField('media[1][fields][field_media_test_image][0][alt]', $filenames[1]); + // Assert the file is available in the file storage. + $this->assertCount(1, $file_storage->loadByProperties(['filename' => $filenames[1]])); // Remove the second file and assert the focus is shifted to the container // of the next media item and field values are still correct. $page->pressButton('media-1-remove-button');