Skip to content
Snippets Groups Projects
Verified Commit d18ca8ba authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3399036 follow-up by Wim Leers, godotislate: CKEditor5PluginManager:...

Issue #3399036 follow-up by Wim Leers, godotislate: CKEditor5PluginManager: use PHP attributes instead of doctrine annotations
parent 96653961
No related branches found
No related tags found
29 merge requests!12227Issue #3181946 by jonmcl, mglaman,!11131[10.4.x-only-DO-NOT-MERGE]: Issue ##2842525 Ajax attached to Views exposed filter form does not trigger callbacks,!9470[10.3.x-only-DO-NOT-MERGE]: #3331771 Fix file_get_contents(): Passing null to parameter,!8540Issue #3457061: Bootstrap Modal dialog Not closing after 10.3.0 Update,!8528Issue #3456871 by Tim Bozeman: Support NULL services,!8373Issue #3427374 by danflanagan8, Vighneshh: taxonomy_tid ViewsArgumentDefault...,!5423Draft: Resolve #3329907 "Test2",!3878Removed unused condition head title for views,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3478Issue #3337882: Deleted menus are not removed from content type config,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3133core/modules/system/css/components/hidden.module.css,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2062Issue #3246454: Add weekly granularity to views date sort,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #160079 canceled
Pipeline: drupal

#160082

    ......@@ -6,6 +6,8 @@
    use Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition;
    use Drupal\Component\Plugin\Attribute\Plugin;
    use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
    use Drupal\Core\StringTranslation\TranslatableMarkup;
    /**
    * The CKEditor5Plugin attribute.
    ......@@ -55,6 +57,39 @@ public function __construct(
    array|DrupalAspectsOfCKEditor5Plugin|null $drupal = NULL,
    public readonly ?string $deriver = NULL,
    ) {
    // If either of the two aspects of the plugin definition is in array form,
    // then this is a YAML-defined CKEditor 5 plugin definition. To avoid errors
    // due to violating either Attribute class constructor, verify basic data
    // shape requirements here. This provides a better DX for YAML-defined
    // plugins, and avoids the need for a PHP IDE or debugger.
    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginManager::processDefinition()
    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::validateCKEditor5Aspects()
    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::validateDrupalAspects()
    if (!$drupal instanceof DrupalAspectsOfCKEditor5Plugin) {
    if ($drupal === NULL) {
    throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "drupal" key.', $id));
    }
    // TRICKY: $this->deriver is incorrect due to AttributeBridgeDecorator!
    // If there's no deriver, validate here. Otherwise: the base definition is
    // allowed to be incomplete; let CKEditor5PluginManager::processDefinition
    // perform the validation.
    // @see \Drupal\ckeditor5\Plugin\CKEditor5PluginDefinition::getDeriver()
    // @see \Drupal\Component\Plugin\Discovery\AttributeBridgeDecorator::getDefinitions()
    if (!isset($drupal['deriver'])) {
    if (isset($drupal['label']) && !is_string($drupal['label']) && !$drupal['label'] instanceof TranslatableMarkup) {
    throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.', $id));
    }
    if (!$ckeditor5 instanceof CKEditor5AspectsOfCKEditor5Plugin) {
    if ($ckeditor5 === NULL) {
    throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5" key.', $id));
    }
    if (!isset($ckeditor5['plugins'])) {
    throw new InvalidPluginDefinitionException($id, sprintf('The "%s" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.', $id));
    }
    }
    }
    }
    $this->ckeditor5 = is_array($ckeditor5) ? new CKEditor5AspectsOfCKEditor5Plugin(...$ckeditor5) : $ckeditor5;
    $this->drupal = is_array($drupal) ? new DrupalAspectsOfCKEditor5Plugin(...$drupal) : $drupal;
    }
    ......
    ......@@ -225,15 +225,16 @@ public static function providerTestInvalidPluginDefinitions(): \Generator {
    yield 'only plugin ID, nothing else' => [
    <<<YAML
    foo_bar: {}
    ckeditor5_invalid_plugin_foo_bar: {}
    YAML,
    InvalidPluginDefinitionException::class,
    'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
    'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal" key.',
    ];
    yield 'fixed plugin ID' => [
    yield 'added drupal' => [
    <<<YAML
    ckeditor5_invalid_plugin_foo_bar: {}
    ckeditor5_invalid_plugin_foo_bar:
    drupal: {}
    YAML,
    InvalidPluginDefinitionException::class,
    'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5" key.',
    ......@@ -243,22 +244,13 @@ public static function providerTestInvalidPluginDefinitions(): \Generator {
    <<<YAML
    ckeditor5_invalid_plugin_foo_bar:
    ckeditor5: {}
    YAML,
    \ArgumentCountError::class,
    NULL,
    ];
    yield 'added ckeditor5.plugins' => [
    <<<YAML
    ckeditor5_invalid_plugin_foo_bar:
    ckeditor5:
    plugins: {}
    drupal: {}
    YAML,
    InvalidPluginDefinitionException::class,
    'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "drupal" key.',
    'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition must contain a "ckeditor5.plugins" key.',
    ];
    yield 'added drupal' => [
    yield 'added ckeditor5.plugins' => [
    <<<YAML
    ckeditor5_invalid_plugin_foo_bar:
    ckeditor5:
    ......@@ -277,7 +269,8 @@ public static function providerTestInvalidPluginDefinitions(): \Generator {
    drupal:
    label: {}
    YAML,
    \TypeError::class,
    InvalidPluginDefinitionException::class,
    'The "ckeditor5_invalid_plugin_foo_bar" CKEditor 5 plugin definition has a "drupal.label" value that is not a string nor a TranslatableMarkup instance.',
    ];
    yield 'fixed drupal.label' => [
    ......@@ -347,6 +340,21 @@ public static function providerTestInvalidPluginDefinitions(): \Generator {
    YAML,
    ];
    yield 'change plugin ID to something invalid' => [
    <<<YAML
    foo_bar:
    ckeditor5:
    plugins: {}
    drupal:
    label: "Foo bar"
    elements:
    - <foo>
    - <bar>
    YAML,
    InvalidPluginDefinitionException::class,
    'The "foo_bar" CKEditor 5 plugin definition must have a plugin ID that starts with "ckeditor5_invalid_plugin_".',
    ];
    yield 'alternative fix for drupal.elements' => [
    <<<YAML
    ckeditor5_invalid_plugin_foo_bar:
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment