diff --git a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php index 606d6c6e66..f72e67ed0a 100644 --- a/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php +++ b/core/modules/ckeditor5/src/Plugin/CKEditor5Plugin/MediaLibrary.php @@ -88,9 +88,9 @@ public function getDynamicPluginConfig(array $static_plugin_config, EditorInterf 'media_library.opener.editor', $media_type_ids, reset($media_type_ids), - $form_mode, 1, ['filter_format_id' => $editor->getFilterFormat()->id()], + $form_mode, ); $library_url = Url::fromRoute('media_library.ui') diff --git a/core/modules/media_library/src/MediaLibraryState.php b/core/modules/media_library/src/MediaLibraryState.php index ef659d8163..741f825abe 100644 --- a/core/modules/media_library/src/MediaLibraryState.php +++ b/core/modules/media_library/src/MediaLibraryState.php @@ -43,20 +43,25 @@ */ class MediaLibraryState extends ParameterBag implements CacheableDependencyInterface { + const DEFAULT_FORM_MODE = 'media_library'; + /** * {@inheritdoc} */ public function __construct(array $parameters = []) { + $parameters += [ + 'media_library_form_mode' => self::DEFAULT_FORM_MODE, + 'media_library_opener_parameters' => [], + ]; + $this->validateRequiredParameters( $parameters['media_library_opener_id'], $parameters['media_library_allowed_types'], $parameters['media_library_selected_type'], + $parameters['media_library_remaining'], $parameters['media_library_form_mode'], - $parameters['media_library_remaining']); + ); - $parameters += [ - 'media_library_opener_parameters' => [], - ]; parent::__construct($parameters); $this->set('hash', $this->getHash()); } @@ -70,25 +75,25 @@ public function __construct(array $parameters = []) { * The allowed media type IDs. * @param string $selected_type_id * The selected media type ID. - * @param string $form_mode - * The form_mode machine name for the add media form. * @param int $remaining_slots * The number of remaining items the user is allowed to select or add in the * library. * @param array $opener_parameters * (optional) Any additional opener-specific parameter values. + * @param string $form_mode + * The form_mode machine name for the add media form. * * @return static * A state object. */ - public static function create($opener_id, array $allowed_media_type_ids, $selected_type_id, $form_mode, $remaining_slots, array $opener_parameters = []) { + public static function create($opener_id, array $allowed_media_type_ids, $selected_type_id, $remaining_slots, array $opener_parameters = [], $form_mode = self::DEFAULT_FORM_MODE) { $state = new static([ 'media_library_opener_id' => $opener_id, 'media_library_allowed_types' => $allowed_media_type_ids, 'media_library_selected_type' => $selected_type_id, - 'media_library_form_mode' => $form_mode, 'media_library_remaining' => $remaining_slots, 'media_library_opener_parameters' => $opener_parameters, + 'media_library_form_mode' => $form_mode, ]); return $state; } @@ -114,9 +119,9 @@ public static function fromRequest(Request $request) { $query->get('media_library_opener_id'), $query->all('media_library_allowed_types'), $query->get('media_library_selected_type'), - $query->get('media_library_form_mode'), $query->get('media_library_remaining'), - $query->all('media_library_opener_parameters') + $query->all('media_library_opener_parameters'), + $query->get('media_library_form_mode') ); // The request parameters need to contain a valid hash to prevent a @@ -151,7 +156,7 @@ public static function fromRequest(Request $request) { * If one of the passed arguments is missing or does not pass the * validation. */ - protected function validateRequiredParameters($opener_id, array $allowed_media_type_ids, $selected_type_id, $form_mode, $remaining_slots) { + protected function validateRequiredParameters($opener_id, array $allowed_media_type_ids, $selected_type_id, $remaining_slots, $form_mode) { // The opener ID must be a non-empty string. if (!is_string($opener_id) || empty(trim($opener_id))) { throw new \InvalidArgumentException('The opener ID parameter is required and must be a string.'); @@ -206,9 +211,9 @@ public function getHash() { $this->getOpenerId(), implode(':', $allowed_media_type_ids), $this->getSelectedTypeId(), - $this->getFormModeId(), $this->getAvailableSlots(), serialize($opener_parameters), + $this->getFormModeId(), ]); return Crypt::hmacBase64($hash, \Drupal::service('private_key')->get() . Settings::getHashSalt()); diff --git a/core/modules/media_library/src/MediaLibraryUiBuilder.php b/core/modules/media_library/src/MediaLibraryUiBuilder.php index 068aa220d8..03fc751b93 100644 --- a/core/modules/media_library/src/MediaLibraryUiBuilder.php +++ b/core/modules/media_library/src/MediaLibraryUiBuilder.php @@ -239,7 +239,7 @@ protected function buildMediaTypeMenu(MediaLibraryState $state) { $selected_type_id = $state->getSelectedTypeId(); foreach ($allowed_types as $allowed_type_id => $allowed_type) { - $link_state = MediaLibraryState::create($state->getOpenerId(), $state->getAllowedTypeIds(), $allowed_type_id, $state->getFormModeId(), $state->getAvailableSlots(), $state->getOpenerParameters()); + $link_state = MediaLibraryState::create($state->getOpenerId(), $state->getAllowedTypeIds(), $allowed_type_id, $state->getAvailableSlots(), $state->getOpenerParameters(), $state->getFormModeId()); // Add the 'media_library_content' parameter so the response will contain // only the updated content for the tab. 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 d6458b9921..bd00c4499e 100644 --- a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php +++ b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php @@ -526,7 +526,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen } $form_mode = $this->getSetting('form_mode') ?? 'media_library'; - $state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_media_type_ids, $selected_type_id, $form_mode, $remaining, $opener_parameters); + $state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_media_type_ids, $selected_type_id, $remaining, $opener_parameters, $form_mode); // Add a button that will load the Media library in a modal using AJAX. $element['open_button'] = [ diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php index d3ef502a17..0f10d0aa8b 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php @@ -65,11 +65,11 @@ public function testWidgetAccess() { $allowed_types = ['type_one', 'type_two', 'type_three', 'type_four']; // The opener parameters are not relevant to the test, but the opener // expects them to be there or it will deny access. - $state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_types, 'type_three', $form_mode, 2, [ + $state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_types, 'type_three', 2, [ 'entity_type_id' => 'node', 'bundle' => 'basic_page', 'field_name' => 'field_unlimited_media', - ]); + ], $form_mode); $url_options = ['query' => $state->all()]; // Verify that unprivileged users can't access the widget view. diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php index 9a49fa9aae..4ee1c27267 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php @@ -112,11 +112,14 @@ public function testFieldWidgetEntityCreateAccess() { $form_mode = 'media_library'; // Create a media library state to test access. - $state = MediaLibraryState::create('media_library.opener.field_widget', ['file', 'image'], 'file', $form_mode, 2, [ + $state = MediaLibraryState::create('media_library.opener.field_widget', [ + 'file', + 'image' + ], 'file', 2, [ 'entity_type_id' => 'entity_test', 'bundle' => 'test', 'field_name' => 'field_test_media', - ]); + ], $form_mode); $access_result = $ui_builder->checkAccess($this->createUser(), $state); $this->assertAccess($access_result, FALSE, "The following permissions are required: 'administer entity_test content' OR 'administer entity_test_with_bundle content' OR 'create test entity_test_with_bundle entities'.", [], ['url.query_args', 'user.permissions']); @@ -168,9 +171,9 @@ public function testEditorOpenerAccess($media_embed_enabled, $can_use_format) { 'media_library.opener.editor', ['image'], 'image', - $form_mode, 1, - ['filter_format_id' => $format->id()] + ['filter_format_id' => $format->id()], + $form_mode ); $access_result = $this->container @@ -228,14 +231,14 @@ public function testFieldWidgetEntityEditAccess() { 'media_library.opener.field_widget', ['file', 'image'], 'file', - $form_mode, 2, [ 'entity_type_id' => $forbidden_entity->getEntityTypeId(), 'bundle' => $forbidden_entity->bundle(), 'field_name' => 'field_test_media', 'entity_id' => $forbidden_entity->id(), - ] + ], + $form_mode ); $access_result = $ui_builder->checkAccess($this->createUser(), $state); @@ -255,9 +258,9 @@ public function testFieldWidgetEntityEditAccess() { $state->getOpenerId(), $state->getAllowedTypeIds(), $state->getSelectedTypeId(), - $state->getFormModeId(), $state->getAvailableSlots(), - $parameters + $parameters, + $state->getFormModeId() ); $access_result = $ui_builder->checkAccess($this->createUser(), $state); @@ -328,13 +331,13 @@ public function testFieldWidgetEntityFieldAccess(string $field_type) { 'media_library.opener.field_widget', ['file', 'image'], 'file', - $form_mode, 2, [ - 'entity_type_id' => 'entity_test', - 'bundle' => 'test', - 'field_name' => $field_storage->getName(), - ]); + 'entity_type_id' => 'entity_test', + 'bundle' => 'test', + 'field_name' => $field_storage->getName(), + ], + $form_mode); $access_result = $ui_builder->checkAccess($account, $state); $this->assertAccess($access_result, FALSE, 'Field access denied by test module', [], ['url.query_args', 'user.permissions']); @@ -352,9 +355,9 @@ public function testFieldWidgetEntityFieldAccess(string $field_type) { $state->getOpenerId(), $state->getAllowedTypeIds(), $state->getSelectedTypeId(), - $state->getFormModeId(), $state->getAvailableSlots(), - $parameters + $parameters, + $state->getFormModeId() ); $access_result = $ui_builder->checkAccess($account, $state); $this->assertAccess($access_result, FALSE, 'Field access denied by test module', [], ['url.query_args', 'user.permissions']); @@ -375,13 +378,13 @@ public function testViewAccess() { 'media_library.opener.field_widget', ['file', 'image'], 'file', - $form_mode, 2, [ 'entity_type_id' => 'entity_test', 'bundle' => 'test', 'field_name' => 'field_test_media', - ]); + ], + $form_mode); // Create a clone of the view so we can reset the original later. $view_original = clone Views::getView('media_library'); @@ -447,11 +450,11 @@ public function testAddFormAccess(): void { /** @var \Drupal\media_library\MediaLibraryUiBuilder $ui_builder */ $ui_builder = $this->container->get('media_library.ui_builder'); - $state = MediaLibraryState::create('test', $media_types, $media_types[0], $form_mode, 1); + $state = MediaLibraryState::create('test', $media_types, $media_types[0], 1, [], $form_mode); $build = $ui_builder->buildUi($state); $this->assertEmpty($build['content']['form']); - $state = MediaLibraryState::create('test', $media_types, $media_types[1], $form_mode, 1); + $state = MediaLibraryState::create('test', $media_types, $media_types[1], 1, [], $form_mode); $build = $ui_builder->buildUi($state); $this->assertNotEmpty($build['content']['form']); } diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php index 155aac51be..edea0e3e3a 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php @@ -121,7 +121,7 @@ public function testMediaTypeAddForm() { protected function buildLibraryUi($selected_type_id) { // @todo where should this be pulled from? The field widget specifies. $form_mode = 'media_library'; - $state = MediaLibraryState::create('test', ['image', 'remote_video'], $selected_type_id, $form_mode, -1); + $state = MediaLibraryState::create('test', ['image', 'remote_video'], $selected_type_id, -1, [], $form_mode); return \Drupal::service('media_library.ui_builder')->buildUi($state); } @@ -141,7 +141,7 @@ public function testFormStateValidation() { public function testSelectedTypeValidation() { // @todo where should this be pulled from? The field widget specifies. $form_mode = 'media_library'; - $state = MediaLibraryState::create('test', ['image', 'remote_video', 'header_image'], 'header_image', $form_mode, -1); + $state = MediaLibraryState::create('test', ['image', 'remote_video', 'header_image'], 'header_image', -1, [], $form_mode); $form_state = new FormState(); $form_state->set('media_library_state', $state); $this->expectException(\InvalidArgumentException::class); diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php index 8cc797b857..ea381c7c3f 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php @@ -22,6 +22,11 @@ class MediaLibraryStateTest extends KernelTestBase { use MediaTypeCreationTrait; + /** + * @var \Drupal\media\MediaTypeInterface|string + */ + protected static $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + /** * {@inheritdoc} */ @@ -55,7 +60,6 @@ protected function setUp(): void { 'media', 'media_library', ]); - $this->form_mode = 'media_library'; // Create some media types to validate against. $this->createMediaType('file', ['id' => 'document']); @@ -72,14 +76,14 @@ public function testMethods() { $selected_media_type_id = 'image'; $remaining_slots = 2; - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, $this->form_mode, $remaining_slots); + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, $remaining_slots, [], $this->form_mode); $this->assertSame($opener_id, $state->getOpenerId()); $this->assertSame($allowed_media_type_ids, $state->getAllowedTypeIds()); $this->assertSame($selected_media_type_id, $state->getSelectedTypeId()); $this->assertSame($remaining_slots, $state->getAvailableSlots()); $this->assertTrue($state->hasSlotsAvailable()); - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, $this->form_mode, 0); + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, 0, [], $this->form_mode); $this->assertFalse($state->hasSlotsAvailable()); } @@ -106,7 +110,7 @@ public function testCreate($opener_id, array $allowed_media_type_ids, $selected_ $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage($exception_message); } - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_type_id, $this->form_mode, $remaining_slots); + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_type_id, $remaining_slots, [], $this->form_mode); $this->assertInstanceOf(MediaLibraryState::class, $state); // Ensure that the state object carries cache metadata. @@ -282,7 +286,7 @@ public function providerCreate() { public function testFromRequest(array $query_overrides, $exception_expected) { // Override the query parameters and verify an exception is thrown when // required state parameters are changed. - $query = MediaLibraryState::create('test', ['file', 'image'], 'image', $this->form_mode, 2)->all(); + $query = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $this->form_mode)->all(); $query = array_merge($query, $query_overrides); if ($exception_expected) { $this->expectException(BadRequestHttpException::class); @@ -374,9 +378,7 @@ public function providerFromRequest() { * @covers ::getOpenerParameters */ public function testOpenerParameters() { - $state = MediaLibraryState::create('test', ['file'], 'file', $this->form_mode, -1, [ - 'foo' => 'baz', - ]); + $state = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz',], $this->form_mode); $this->assertSame(['foo' => 'baz'], $state->getOpenerParameters()); } @@ -384,8 +386,8 @@ public function testOpenerParameters() { * Tests that hash is unaffected by allowed media type order. */ public function testHashUnaffectedByMediaTypeOrder() { - $state1 = MediaLibraryState::create('test', ['file', 'image'], 'image', $this->form_mode, 2); - $state2 = MediaLibraryState::create('test', ['image', 'file'], 'image', $this->form_mode, 2); + $state1 = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $this->form_mode); + $state2 = MediaLibraryState::create('test', ['image', 'file'], 'image', 2, [], $this->form_mode); $this->assertSame($state1->getHash(), $state2->getHash()); } @@ -393,14 +395,8 @@ public function testHashUnaffectedByMediaTypeOrder() { * Tests that hash is unaffected by opener parameter order. */ public function testHashUnaffectedByOpenerParamOrder() { - $state1 = MediaLibraryState::create('test', ['file'], 'file', $this->form_mode, -1, [ - 'foo' => 'baz', - 'baz' => 'foo', - ]); - $state2 = MediaLibraryState::create('test', ['file'], 'file', $this->form_mode, -1, [ - 'baz' => 'foo', - 'foo' => 'baz', - ]); + $state1 = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz', 'baz' => 'foo'], $this->form_mode); + $state2 = MediaLibraryState::create('test', ['file'], 'file', -1, ['baz' => 'foo', 'foo' => 'baz'], $this->form_mode); $this->assertSame($state1->getHash(), $state2->getHash()); }