From e8d2c22ac125402040c7214db3c2a5212a548fee Mon Sep 17 00:00:00 2001 From: Lauri Eskola <lauri.eskola@acquia.com> Date: Fri, 17 Nov 2023 13:23:53 +0200 Subject: [PATCH] Issue #3347721 by Wim Leers, dabley, lauriii, smustgrave, witeksocha, Reinmar, thatipudir: [Style] Warn the user about styles for unsupported elements --- .../StyleSensibleElementConstraint.php | 7 +++ ...tyleSensibleElementConstraintValidator.php | 45 +++++++++++++++++++ .../tests/src/Kernel/ValidatorsTest.php | 34 ++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraint.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraint.php index b4be8e0c6441..ef9d9a836875 100644 --- a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraint.php +++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraint.php @@ -39,4 +39,11 @@ class StyleSensibleElementConstraint extends Constraint { */ public $conflictingDisabledPluginMessage = 'A style must only specify classes not supported by other plugins. The <code>@classes</code> classes on <code>@tag</code> are supported by the %plugin plugin. Remove this style and enable that plugin instead.'; + /** + * When a Style is defined for a plugin that does not yet support Style. + * + * @var string + */ + public $unsupportedTagMessage = 'The <code>@tag</code> tag is not yet supported by the Style plugin.'; + } diff --git a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraintValidator.php b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraintValidator.php index 9c0622716a46..c18f860b18d2 100644 --- a/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraintValidator.php +++ b/core/modules/ckeditor5/src/Plugin/Validation/Constraint/StyleSensibleElementConstraintValidator.php @@ -26,6 +26,41 @@ class StyleSensibleElementConstraintValidator extends ConstraintValidator implem use PluginManagerDependentValidatorTrait; use TextEditorObjectDependentValidatorTrait; + /** + * Tags whose plugins are known to not yet integrate with the Style plugin. + * + * To prevent the user from configuring the Style plugin and reasonably + * expecting it to work correctly for tags of plugins that are known to + * yet integrate with the Style plugin, generate a validation error for these. + */ + protected const KNOWN_UNSUPPORTED_TAGS = [ + // @see https://www.drupal.org/project/drupal/issues/3117172 + '<drupal-media>', + // @see https://github.com/ckeditor/ckeditor5/issues/13778 + '<img>', + // @see https://github.com/ckeditor/ckeditor5/blob/39ad30090ead9dd2d54c3ac53d7f446ade9fd8ce/packages/ckeditor5-html-support/src/schemadefinitions.ts#L12-L50 + '<keygen>', + '<applet>', + '<basefont>', + '<isindex>', + '<hr>', + '<br>', + '<area>', + '<command>', + '<map>', + '<wbr>', + '<colgroup>', + '<col>', + '<datalist>', + '<track>', + '<source>', + '<option>', + '<param>', + '<optgroup>', + '<link>', + '<noscript>', + ]; + /** * {@inheritdoc} * @@ -83,6 +118,16 @@ public function validate($element, Constraint $constraint) { ->setParameter('%plugin', $this->findStyleConflictingPluginLabel($style_element)) ->addViolation(); } + + // Finally, while the configuration is technically valid if this point was + // reached, there are some known compatibility issues. Inform the user that + // for that reason, this configuration must be considered invalid. + $unsupported = $style_element->intersect(HTMLRestrictions::fromString(implode(' ', static::KNOWN_UNSUPPORTED_TAGS))); + if (!$unsupported->allowsNothing()) { + $this->context->buildViolation($constraint->unsupportedTagMessage) + ->setParameter('@tag', sprintf("<%s>", $tag)) + ->addViolation(); + } } /** diff --git a/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php index 3919cc58e409..b3be51aa4ea3 100644 --- a/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php +++ b/core/modules/ckeditor5/tests/src/Kernel/ValidatorsTest.php @@ -457,6 +457,40 @@ public function provider(): array { 'settings.plugins.ckeditor5_style.styles.0.element' => 'A style must only specify classes not supported by other plugins. The <code>text-align-justify</code> classes on <code><p></code> are already supported by the enabled <em class="placeholder">Alignment</em> plugin.', ], ]; + $data['INVALID: Style plugin configured to add class to plugin-supported tag known to not work with Style … yet'] = [ + 'settings' => [ + 'toolbar' => [ + 'items' => [ + 'drupalInsertImage', + 'style', + ], + ], + 'plugins' => [ + 'ckeditor5_imageResize' => [ + 'allow_resize' => FALSE, + ], + 'ckeditor5_style' => [ + 'styles' => [ + // @see https://github.com/ckeditor/ckeditor5/issues/13778 + [ + 'label' => 'Featured image', + 'element' => '<img class="featured">', + ], + // @see https://www.drupal.org/project/drupal/issues/3398223 + // @see https://github.com/ckeditor/ckeditor5/blob/39ad30090ead9dd2d54c3ac53d7f446ade9fd8ce/packages/ckeditor5-html-support/src/schemadefinitions.ts#L12-L50 + [ + 'label' => 'Fancy linebreak', + 'element' => '<br class="fancy">', + ], + ], + ], + ], + ], + 'violations' => [ + 'settings.plugins.ckeditor5_style.styles.0.element' => 'The <code><img></code> tag is not yet supported by the Style plugin.', + 'settings.plugins.ckeditor5_style.styles.1.element' => 'The <code><br></code> tag is not yet supported by the Style plugin.', + ], + ]; $data['INVALID: Style plugin has multiple styles with same label'] = [ 'settings' => [ 'toolbar' => [ -- GitLab