Unverified Commit 12fb247a authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #3269657 by hooroomoo, Wim Leers: [drupalMedia] The CKEditor 4 → 5...

Issue #3269657 by hooroomoo, Wim Leers: [drupalMedia] The CKEditor 4 → 5 upgrade path for the media_embed filter should not forcefully allow the `data-view-mode` attribute on `<drupal-media>`

(cherry picked from commit 32bf0369)
(cherry picked from commit ab035217)
parent eb3ef8c0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -644,7 +644,7 @@ media_media:
    library: ckeditor5/drupal.ckeditor5.media
    class: Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media
    elements:
      - <drupal-media data-entity-type data-entity-uuid data-view-mode alt>
      - <drupal-media data-entity-type data-entity-uuid alt data-view-mode>
    conditions:
      filter: media_embed

+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ ckeditor5_valid_pair__format_and_editor:
  label: 'Text Format plus Text Editor pair using CKEditor 5'
  constraints:
    CKEditor5FundamentalCompatibility: []
    CKEditor5MediaAndFilterSettingsInSync: []
  mapping:
    settings:
      type: editor.settings.ckeditor5
+11 −0
Original line number Diff line number Diff line
@@ -102,3 +102,14 @@ ckeditor5.plugin.ckeditor5_list:
      label: 'Allow start index'
      constraints:
        NotNull: []

# Plugin \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media
ckeditor5.plugin.media_media:
  type: mapping
  label: List
  mapping:
    allow_view_mode_override:
      type: boolean
      label: 'Allow view mode override'
      constraints:
        NotNull: []
+13 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@
 *   cke5_plugin_elements_subset_configuration = {
 *    "ckeditor5_heading",
 *    "ckeditor5_list",
 *    "media_media",
 *   }
 * )
 *
@@ -240,6 +241,18 @@ public function computeCKEditor5PluginSubsetConfiguration(string $cke5_plugin_id
        $configuration['startIndex'] = !empty($restrictions['allowed']['ol']['start']);
        return $configuration;

      case 'media_media':
        $restrictions = $text_format->getHtmlRestrictions();
        if ($restrictions === FALSE) {
          // The default is to not allow the user to override the default view mode.
          // @see \Drupal\ckeditor5\Plugin\CKEditor5Plugin\Media::defaultConfiguration()
          return NULL;
        }
        $configuration = [];
        // Check if data-view-mode is allowed.
        $configuration['allow_view_mode_override'] = !empty($restrictions['allowed']['drupal-media']['data-view-mode']);
        return $configuration;

      default:
        throw new \OutOfBoundsException();
    }
+57 −2
Original line number Diff line number Diff line
@@ -4,7 +4,11 @@

namespace Drupal\ckeditor5\Plugin\CKEditor5Plugin;

use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableInterface;
use Drupal\ckeditor5\Plugin\CKEditor5PluginConfigurableTrait;
use Drupal\ckeditor5\Plugin\CKEditor5PluginDefault;
use Drupal\ckeditor5\Plugin\CKEditor5PluginElementsSubsetInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Url;
use Drupal\editor\EditorInterface;
@@ -12,6 +16,7 @@
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
use Drupal\ckeditor5\HTMLRestrictions;

/**
 * CKEditor 5 Media plugin.
@@ -21,9 +26,10 @@
 * @internal
 *   Plugin classes are internal.
 */
class Media extends CKEditor5PluginDefault implements ContainerFactoryPluginInterface {
class Media extends CKEditor5PluginDefault implements ContainerFactoryPluginInterface, CKEditor5PluginConfigurableInterface, CKEditor5PluginElementsSubsetInterface {

  use DynamicPluginConfigWithCsrfTokenUrlTrait;
  use CKEditor5PluginConfigurableTrait;

  /**
   * The entity display repository.
@@ -173,7 +179,9 @@ public function getDynamicPluginConfig(array $static_plugin_config, EditorInterf
    ] = self::configureViewModes($editor);

    $dynamic_plugin_config['drupalElementStyles']['viewMode'] = $element_style_configuration;
    if ($this->getConfiguration()['allow_view_mode_override']) {
      $dynamic_plugin_config['drupalMedia']['toolbar'][] = $toolbar_configuration;
    }
    $dynamic_plugin_config['drupalMedia']['metadataUrl'] = self::getUrlWithReplacedCsrfTokenPlaceholder(
      Url::fromRoute('ckeditor5.media_entity_metadata')
        ->setRouteParameter('editor', $editor->id())
@@ -182,4 +190,51 @@ public function getDynamicPluginConfig(array $static_plugin_config, EditorInterf
    return $dynamic_plugin_config;
  }

  /**
   * {@inheritdoc}
   */
  public function getElementsSubset(): array {
    $all_elements = $this->getPluginDefinition()->getElements();
    $subset = HTMLRestrictions::fromString(implode($all_elements));
    $view_mode_override_enabled = $this->getConfiguration()['allow_view_mode_override'];
    if (!$view_mode_override_enabled) {
      $subset = $subset->diff(HTMLRestrictions::fromString('<drupal-media data-view-mode>'));
    }
    return $subset->toCKEditor5ElementsArray();
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return ['allow_view_mode_override' => FALSE];
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['allow_view_mode_override'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Allow the user to override the default view mode'),
      '#default_value' => $this->configuration['allow_view_mode_override'],
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
    $form_value = $form_state->getValue('allow_view_mode_override');
    $form_state->setValue('allow_view_mode_override', (bool) $form_value);
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration['allow_view_mode_override'] = $form_state->getValue('allow_view_mode_override');
  }

}
Loading