Commit d4da802f authored by catch's avatar catch
Browse files

Issue #3067580 by alexpott, andypost, pooja saraah, Niklan, smustgrave:...

Issue #3067580 by alexpott, andypost, pooja saraah, Niklan, smustgrave: Deprecate the AJAX RenderElement
parent 8a2f6514
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -10,9 +10,22 @@
 * @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}
   */
+11 −0
Original line number Diff line number Diff line
@@ -107,6 +107,16 @@ protected function buildInfo($theme_name) {

    // 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 @@ protected function buildInfo($theme_name) {
      }
      $info[$element_type] = $element_info;
    }
    restore_error_handler();

    foreach ($info as $element_type => $element) {
      $info[$element_type]['#type'] = $element_type;
+29 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\element_info_test\Element;

use Drupal\Core\Render\Element\RenderElement;

/**
 * Provides deprecated render element for testing.
 *
 * @RenderElement("deprecated")
 */
class Deprecated extends RenderElement {

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    @trigger_error(__CLASS__ . ' is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED);
  }

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    return [];
  }

}
+48 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\KernelTests\Core\Render\Element;

use Drupal\KernelTests\KernelTestBase;

/**
 * @group Render
 */
class DeprecatedElementTest extends KernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['element_info_test'];

  /**
   * Tests that render elements can trigger deprecations in their constructor.
   */
  public function testBuildInfo() {
    $info_manager = $this->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();
  }

}