Commit b96392e6 authored by catch's avatar catch
Browse files

Issue #3276627 by Wim Leers, hooroomoo:...

Issue #3276627 by Wim Leers, hooroomoo: CKEditor5::shouldHaveVisiblePluginSettingsForm() does not correctly handle configurable CKE5 plugin that has a filter condition

(cherry picked from commit b26aa84f)
parent 1ddf650f
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -421,20 +421,28 @@ private function shouldHaveVisiblePluginSettingsForm(CKEditor5PluginDefinition $
    // due to isEnabled() returning false, that should still have its config
    // form provided:
    // 1 - A conditionally enabled plugin that does not depend on a toolbar item
    // to be active AND the plugins it depends on are enabled.
    // to be active AND the plugins it depends on are enabled (if any) AND the
    // filter it depends on is enabled (if any).
    // 2 - A conditionally enabled plugin that does depend on a toolbar item,
    // and that toolbar item is active.
    if ($definition->hasConditions()) {
      $conditions = $definition->getConditions();
      if (!array_key_exists('toolbarItem', $conditions)) {
        $conclusion = TRUE;
        // The filter this plugin depends on must be enabled.
        if (array_key_exists('filter', $conditions)) {
          $required_filter = $conditions['filter'];
          $format_filters = $editor->getFilterFormat()->filters();
          $conclusion = $conclusion && $format_filters->has($required_filter) && $format_filters->get($required_filter)->status;
        }
        // The CKEditor 5 plugins this plugin depends on must be enabled.
        if (array_key_exists('plugins', $conditions)) {
          $all_plugins = $this->ckeditor5PluginManager->getDefinitions();
          $dependencies = array_intersect_key($all_plugins, array_flip($conditions['plugins']));
          $unmet_dependencies = array_diff_key($dependencies, $enabled_plugins);
          return empty($unmet_dependencies);
          $conclusion = $conclusion && empty($unmet_dependencies);
        }
        return TRUE;
        return $conclusion;
      }
      elseif (in_array($conditions['toolbarItem'], $editor->getSettings()['toolbar']['items'], TRUE)) {
        return TRUE;
+3 −0
Original line number Diff line number Diff line
@@ -7,3 +7,6 @@ ckeditor5_plugin_elements_subset_sneakySuperset:
    elements:
      - <foo>
      - <bar>
    # @todo Remove in https://www.drupal.org/project/drupal/issues/3269657
    conditions:
      filter: media_embed
+16 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ class AdminUiTest extends CKEditor5TestBase {
  protected static $modules = [
    'media_library',
    'ckeditor',
    // @todo Remove in https://www.drupal.org/project/drupal/issues/3269657
    'ckeditor5_plugin_elements_subset',
    'ckeditor5_incompatible_filter_test',
  ];

@@ -219,6 +221,20 @@ public function testPluginSettingsFormSection() {

    // The source plugin config form should be present.
    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-sourceediting"]');

    // The filter-dependent configurable plugin should not be present.
    // @todo Change to `media_media` plugin in https://www.drupal.org/project/drupal/issues/3269657
    // cSpell:disable-next-line
    $assert_session->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-plugin-elements-subset-sneakysuperset"]');

    // Enable the filter that the configurable plugin depends on.
    $this->assertTrue($page->hasUncheckedField('filters[media_embed][status]'));
    $page->checkField('filters[media_embed][status]');
    $assert_session->assertWaitOnAjaxRequest();

    // The filter-dependent configurable plugin should be present.
    // cSpell:disable-next-line
    $assert_session->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-plugin-elements-subset-sneakysuperset"]');
  }

  /**