diff --git a/core/lib/Drupal/Core/Render/Element/Ajax.php b/core/lib/Drupal/Core/Render/Element/Ajax.php index d22d7edf221..3edc75f0cca 100644 --- a/core/lib/Drupal/Core/Render/Element/Ajax.php +++ b/core/lib/Drupal/Core/Render/Element/Ajax.php @@ -10,9 +10,22 @@ namespace Drupal\Core\Render\Element; * @ingroup ajax * * @RenderElement("ajax") + * + * @deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an + * \Drupal\Core\Ajax\AjaxResponse instead. + * + * @see https://www.drupal.org/node/3068104 */ class Ajax extends RenderElement { + /** + * {@inheritdoc} + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + @trigger_error('\Drupal\Core\Render\Element\Ajax is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an \Drupal\Core\Ajax\AjaxResponse instead. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED); + } + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Render/ElementInfoManager.php b/core/lib/Drupal/Core/Render/ElementInfoManager.php index ed927652634..37f485793b5 100644 --- a/core/lib/Drupal/Core/Render/ElementInfoManager.php +++ b/core/lib/Drupal/Core/Render/ElementInfoManager.php @@ -107,6 +107,16 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana // Otherwise, rebuild and cache. $info = []; + $previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) { + // Ignore deprecations while building element information. + if ($severity === E_USER_DEPRECATED) { + // Don't execute PHP internal error handler. + return TRUE; + } + if ($previous_error_handler) { + return $previous_error_handler($severity, $message, $file, $line); + } + }); foreach ($this->getDefinitions() as $element_type => $definition) { $element = $this->createInstance($element_type); $element_info = $element->getInfo(); @@ -119,6 +129,7 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana } $info[$element_type] = $element_info; } + restore_error_handler(); foreach ($info as $element_type => $element) { $info[$element_type]['#type'] = $element_type; diff --git a/core/modules/system/tests/modules/element_info_test/src/Element/Deprecated.php b/core/modules/system/tests/modules/element_info_test/src/Element/Deprecated.php new file mode 100644 index 00000000000..8716fe90343 --- /dev/null +++ b/core/modules/system/tests/modules/element_info_test/src/Element/Deprecated.php @@ -0,0 +1,29 @@ +container->get('plugin.manager.element_info'); + $this->assertSame([ + '#type' => 'deprecated', + '#defaults_loaded' => TRUE, + ], $info_manager->getInfo('deprecated')); + + // Ensure the constructor is triggering a deprecation error. + $previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) { + // Convert deprecation error into a catchable exception. + if ($severity === E_USER_DEPRECATED) { + throw new \ErrorException($message, 0, $severity, $file, $line); + } + if ($previous_error_handler) { + return $previous_error_handler($severity, $message, $file, $line); + } + }); + + try { + $info_manager->createInstance('deprecated'); + $this->fail('No deprecation error triggered.'); + } + catch (\ErrorException $e) { + $this->assertSame('Drupal\element_info_test\Element\Deprecated is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', $e->getMessage()); + } + restore_error_handler(); + } + +}