diff --git a/composer.json b/composer.json index a6251b0787..9140ef0ba6 100644 --- a/composer.json +++ b/composer.json @@ -27,8 +27,8 @@ "phpunit/phpunit": "^8.5.14 || ^9", "phpspec/prophecy": "^1.12", "symfony/css-selector": "^4.4", - "symfony/phpunit-bridge": "^5.3.0-rc1", - "symfony/var-dumper": "^5.3.0-rc1", + "symfony/phpunit-bridge": "^5.1.4", + "symfony/var-dumper": "^5.1.2", "symfony/error-handler": "^4.4", "justinrainbow/json-schema": "^5.2", "symfony/filesystem": "^4.4", diff --git a/composer.lock b/composer.lock index a0557a0147..6ddd74174b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9caab8f13f1024c45a4184d7c351370c", + "content-hash": "a21f5caf56f7a0d3a198f41c3fb84eac", "packages": [ { "name": "asm89/stack-cors", @@ -534,7 +534,7 @@ "dist": { "type": "path", "url": "core", - "reference": "454ec5a15af2123c790974d1ad622bbb8ed61ec5" + "reference": "8c4a55a02c2380b587e1d59919848c0305c237ff" }, "require": { "asm89/stack-cors": "^1.1", @@ -569,7 +569,7 @@ "symfony/event-dispatcher": "^4.4", "symfony/http-foundation": "^4.4.7", "symfony/http-kernel": "^4.4", - "symfony/mime": "^5.3.0-rc1", + "symfony/mime": "^5.2", "symfony/polyfill-iconv": "^1.0", "symfony/process": "^4.4", "symfony/psr-http-message-bridge": "^2.0", @@ -2996,16 +2996,16 @@ }, { "name": "symfony/mime", - "version": "v5.3.0-RC1", + "version": "v5.2.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0c3daded809edda4adee7179122a2a98069d8df7" + "reference": "64258e870f8cc75c3dae986201ea2df58c210b52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0c3daded809edda4adee7179122a2a98069d8df7", - "reference": "0c3daded809edda4adee7179122a2a98069d8df7", + "url": "https://api.github.com/repos/symfony/mime/zipball/64258e870f8cc75c3dae986201ea2df58c210b52", + "reference": "64258e870f8cc75c3dae986201ea2df58c210b52", "shasum": "" }, "require": { @@ -3059,7 +3059,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.0-RC1" + "source": "https://github.com/symfony/mime/tree/v5.2.9" }, "funding": [ { @@ -3075,7 +3075,7 @@ "type": "tidelift" } ], - "time": "2021-05-16T13:08:56+00:00" + "time": "2021-05-16T13:07:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4252,16 +4252,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.3.0-RC1", + "version": "v5.2.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "29988c9bcac7bb66a03f00a2adaae131778db61c" + "reference": "d693200a73fae179d27f8f1b16b4faf3e8569eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/29988c9bcac7bb66a03f00a2adaae131778db61c", - "reference": "29988c9bcac7bb66a03f00a2adaae131778db61c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d693200a73fae179d27f8f1b16b4faf3e8569eba", + "reference": "d693200a73fae179d27f8f1b16b4faf3e8569eba", "shasum": "" }, "require": { @@ -4320,7 +4320,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.0-RC1" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.8" }, "funding": [ { @@ -4336,7 +4336,7 @@ "type": "tidelift" } ], - "time": "2021-05-07T14:34:05+00:00" + "time": "2021-05-07T13:42:21+00:00" }, { "name": "symfony/yaml", @@ -7810,26 +7810,26 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v5.3.0-RC1", + "version": "v5.2.9", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "f2ecbe9ce01a91dac62356560f1cc903ab689de0" + "reference": "ea24e42c1ee04792f5d814da6f0814b20ece2907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f2ecbe9ce01a91dac62356560f1cc903ab689de0", - "reference": "f2ecbe9ce01a91dac62356560f1cc903ab689de0", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ea24e42c1ee04792f5d814da6f0814b20ece2907", + "reference": "ea24e42c1ee04792f5d814da6f0814b20ece2907", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/deprecation-contracts": "^2.1" + "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0" }, "suggest": { @@ -7873,7 +7873,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.0-RC1" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.9" }, "funding": [ { @@ -7889,7 +7889,7 @@ "type": "tidelift" } ], - "time": "2021-05-16T13:08:56+00:00" + "time": "2021-05-16T13:07:46+00:00" }, { "name": "theseer/tokenizer", diff --git a/composer/Metapackage/CoreRecommended/composer.json b/composer/Metapackage/CoreRecommended/composer.json index e5dbaa3207..b9c77d17fb 100644 --- a/composer/Metapackage/CoreRecommended/composer.json +++ b/composer/Metapackage/CoreRecommended/composer.json @@ -45,7 +45,7 @@ "symfony/http-client-contracts": "v2.4.0", "symfony/http-foundation": "v4.4.23", "symfony/http-kernel": "v4.4.24", - "symfony/mime": "v5.3.0-RC1", + "symfony/mime": "v5.2.9", "symfony/polyfill-ctype": "v1.22.1", "symfony/polyfill-iconv": "v1.22.1", "symfony/polyfill-intl-idn": "v1.22.1", @@ -60,7 +60,7 @@ "symfony/translation": "v4.4.24", "symfony/translation-contracts": "v2.4.0", "symfony/validator": "v4.4.24", - "symfony/var-dumper": "v5.3.0-RC1", + "symfony/var-dumper": "v5.2.8", "symfony/yaml": "v4.4.24", "twig/twig": "v2.14.6", "typo3/phar-stream-wrapper": "v3.1.6" diff --git a/composer/Metapackage/DevDependencies/composer.json b/composer/Metapackage/DevDependencies/composer.json index 9eb0f0edeb..b9458d39b5 100644 --- a/composer/Metapackage/DevDependencies/composer.json +++ b/composer/Metapackage/DevDependencies/composer.json @@ -27,7 +27,7 @@ "symfony/filesystem": "^4.4", "symfony/finder": "^4.4", "symfony/lock": "^4.4", - "symfony/phpunit-bridge": "^5.3.0-rc1", - "symfony/var-dumper": "^5.3.0-rc1" + "symfony/phpunit-bridge": "^5.1.4", + "symfony/var-dumper": "^5.1.2" } } diff --git a/composer/Metapackage/PinnedDevDependencies/composer.json b/composer/Metapackage/PinnedDevDependencies/composer.json index f99fbae1b3..f769a5fc4b 100644 --- a/composer/Metapackage/PinnedDevDependencies/composer.json +++ b/composer/Metapackage/PinnedDevDependencies/composer.json @@ -60,7 +60,7 @@ "symfony/filesystem": "v4.4.22", "symfony/finder": "v4.4.24", "symfony/lock": "v4.4.23", - "symfony/phpunit-bridge": "v5.3.0-RC1", + "symfony/phpunit-bridge": "v5.2.9", "theseer/tokenizer": "1.2.0", "webmozart/assert": "1.10.0" } diff --git a/core/composer.json b/core/composer.json index b0677e756a..80d56099db 100644 --- a/core/composer.json +++ b/core/composer.json @@ -23,7 +23,7 @@ "symfony/event-dispatcher": "^4.4", "symfony/http-foundation": "^4.4.7", "symfony/http-kernel": "^4.4", - "symfony/mime": "^5.3.0-rc1", + "symfony/mime": "^5.2", "symfony/routing": "^4.4", "symfony/serializer": "^4.4", "symfony/translation": "^4.4", diff --git a/core/lib/Drupal/Component/Utility/Mail.php b/core/lib/Drupal/Component/Utility/Mail.php index 50c998686c..423cfb2668 100644 --- a/core/lib/Drupal/Component/Utility/Mail.php +++ b/core/lib/Drupal/Component/Utility/Mail.php @@ -2,8 +2,6 @@ namespace Drupal\Component\Utility; -@trigger_error('\Drupal\Component\Utility\Mail is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. See https://www.drupal.org/node/3207439', E_USER_DEPRECATED); - /** * Provides helpers to ensure emails are compliant with RFCs. * @@ -31,15 +29,8 @@ class Mail { * @return string * A RFC compliant version of the string, ready to be used as * "display-name" in mail originator header fields. - * - * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use - * \Symfony\Component\Mime\Header\MailboxHeader instead. - * - * @see https://www.drupal.org/node/3207439 */ public static function formatDisplayName($string) { - @trigger_error('\Drupal\Component\Utility\Mail::formatDisplayName() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Mime\Header\MailboxHeader instead. See https://www.drupal.org/node/3207439', E_USER_DEPRECATED); - // Make sure we don't process html-encoded characters. They may create // unneeded trouble if left encoded, besides they will be correctly // processed if decoded. diff --git a/core/lib/Drupal/Component/Utility/Unicode.php b/core/lib/Drupal/Component/Utility/Unicode.php index 4a63ec2e47..a33250f935 100644 --- a/core/lib/Drupal/Component/Utility/Unicode.php +++ b/core/lib/Drupal/Component/Utility/Unicode.php @@ -393,14 +393,8 @@ public static function strcasecmp($str1, $str2) { * * @return string * The mime-encoded header. - * - * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use - * \Symfony\Component\Mime\Header\UnstructuredHeader instead. - * - * @see https://www.drupal.org/node/3207439 */ public static function mimeHeaderEncode($string, $shorten = FALSE) { - @trigger_error('\Drupal\Component\Utility\Unicode::mimeHeaderEncode() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Mime\Header\UnstructuredHeader instead. See https://www.drupal.org/node/3207439', E_USER_DEPRECATED); if (preg_match('/[^\x20-\x7E]/', $string)) { // floor((75 - strlen("=?UTF-8?B??=")) * 0.75); $chunk_size = 47; @@ -429,14 +423,8 @@ public static function mimeHeaderEncode($string, $shorten = FALSE) { * * @return string * The mime-decoded header. - * - * @deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use - * iconv_mime_decode() instead. - * - * @see https://www.drupal.org/node/3207439 */ public static function mimeHeaderDecode($header) { - @trigger_error('\Drupal\Component\Utility\Unicode::mimeHeaderDecode() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use iconv_mime_decode() instead. See https://www.drupal.org/node/3207439', E_USER_DEPRECATED); $callback = function ($matches) { $data = (strtolower($matches[2]) == 'b') ? base64_decode($matches[3]) : str_replace('_', ' ', quoted_printable_decode($matches[3])); if (strtolower($matches[1]) != 'utf-8') { diff --git a/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php b/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php index b5cc94d668..875c9d3ef9 100644 --- a/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php +++ b/core/lib/Drupal/Core/Ajax/AjaxResponseAttachmentsProcessor.php @@ -128,7 +128,7 @@ public function processAttachments(AttachmentsInterface $response) { * An array of commands ready to be returned as JSON. */ protected function buildAttachmentsCommands(AjaxResponse $response, Request $request) { - $ajax_page_state = $request->request->all('ajax_page_state'); + $ajax_page_state = $request->request->get('ajax_page_state'); // Aggregate CSS/JS if necessary, but only during normal site operation. $optimize_css = !defined('MAINTENANCE_MODE') && $this->config->get('css.preprocess'); diff --git a/core/lib/Drupal/Core/Cache/Context/QueryArgsCacheContext.php b/core/lib/Drupal/Core/Cache/Context/QueryArgsCacheContext.php index d9e5d67983..a48664468d 100644 --- a/core/lib/Drupal/Core/Cache/Context/QueryArgsCacheContext.php +++ b/core/lib/Drupal/Core/Cache/Context/QueryArgsCacheContext.php @@ -31,7 +31,7 @@ public function getContext($query_arg = NULL) { return ($value !== NULL) ? $value : ''; } elseif ($this->requestStack->getCurrentRequest()->query->has($query_arg)) { - $value = $this->requestStack->getCurrentRequest()->query->all()[$query_arg]; + $value = $this->requestStack->getCurrentRequest()->query->get($query_arg); if (is_array($value)) { return http_build_query($value); } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php index 6f3c7cac44..93c5387e98 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php @@ -2,6 +2,7 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; +use Drupal\Core\Entity\EntityTypeBundleInfoInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemInterface; @@ -49,11 +50,13 @@ class LanguageFormatter extends StringFormatter { * Any third party settings settings. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. + * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info + * The entity type bundle info. * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager * The language manager. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, LanguageManagerInterface $language_manager) { - parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $entity_type_manager); + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, LanguageManagerInterface $language_manager) { + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $entity_type_manager, $entity_type_bundle_info); $this->languageManager = $language_manager; } @@ -71,6 +74,7 @@ public static function create(ContainerInterface $container, array $configuratio $configuration['view_mode'], $configuration['third_party_settings'], $container->get('entity_type.manager'), + $container->get('entity_type.bundle.info'), $container->get('language_manager') ); } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php index 96f1895840..bef15305ba 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php @@ -10,6 +10,7 @@ use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\Core\Entity\EntityTypeBundleInfoInterface; /** * Plugin implementation of the 'string' formatter. @@ -35,6 +36,13 @@ class StringFormatter extends FormatterBase { */ protected $entityTypeManager; + /** + * The entity type bundle info. + * + * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface + */ + protected $entityTypeBundleInfo; + /** * Constructs a StringFormatter instance. * @@ -54,11 +62,14 @@ class StringFormatter extends FormatterBase { * Any third party settings settings. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. + * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info + * The entity type bundle info. */ - public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager) { + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) { parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); $this->entityTypeManager = $entity_type_manager; + $this->entityTypeBundleInfo = $entity_type_bundle_info; } /** @@ -73,7 +84,8 @@ public static function create(ContainerInterface $container, array $configuratio $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], - $container->get('entity_type.manager') + $container->get('entity_type.manager'), + $container->get('entity_type.bundle.info') ); } @@ -129,7 +141,37 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $entity_type = $entity->getEntityType(); if ($this->getSetting('link_to_entity') && !$entity->isNew() && $entity_type->hasLinkTemplate('canonical')) { - $url = $this->getEntityUrl($entity); + // Check for uri_callback function. + $bundle = $entity->bundle(); + + // A bundle-specific callback takes precedence over the generic one for + // the entity type. + $bundles = $this->entityTypeBundleInfo->getBundleInfo($entity->getEntityTypeId()); + if (isset($bundles[$bundle]['uri_callback'])) { + $uri_callback = $bundles[$bundle]['uri_callback']; + } + elseif ($entity_uri_callback = $entity->getEntityType()->getUriCallback()) { + $uri_callback = $entity_uri_callback; + } + + // Invoke the callback to get the URI. If there is no callback, use the + // default URI format. + if (isset($uri_callback) && is_callable($uri_callback)) { + $url = call_user_func($uri_callback, $entity); + + // Pass the entity data through as options, so that alter functions do not + // need to look up this entity again. + $url + ->setOption('entity_type', $entity->getEntityTypeId()) + ->setOption('entity', $this); + + // Display links by default based on the current language. + $url->setOption('language', $entity->language()); + } + else { + // For the default revision this falls back to 'canonical' + $url = $this->getEntityUrl($entity); + } } foreach ($items as $delta => $item) { diff --git a/core/lib/Drupal/Core/Http/KernelEvent.php b/core/lib/Drupal/Core/Http/KernelEvent.php index 301f31aab3..5a9219c315 100644 --- a/core/lib/Drupal/Core/Http/KernelEvent.php +++ b/core/lib/Drupal/Core/Http/KernelEvent.php @@ -5,7 +5,7 @@ namespace Drupal\Core\Http; -use Drupal\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\Event; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; diff --git a/core/lib/Drupal/Core/Mail/MailManager.php b/core/lib/Drupal/Core/Mail/MailManager.php index 05c0c8adfa..4fd4f9ba7e 100644 --- a/core/lib/Drupal/Core/Mail/MailManager.php +++ b/core/lib/Drupal/Core/Mail/MailManager.php @@ -5,6 +5,7 @@ use Drupal\Component\Render\MarkupInterface; use Drupal\Component\Render\PlainTextOutput; use Drupal\Component\Utility\Html; +use Drupal\Component\Utility\Mail as MailHelper; use Drupal\Core\Logger\LoggerChannelFactoryInterface; use Drupal\Core\Messenger\MessengerTrait; use Drupal\Core\Plugin\DefaultPluginManager; @@ -16,8 +17,6 @@ use Drupal\Core\Render\RendererInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; -use Symfony\Component\Mime\Address; -use Symfony\Component\Mime\Header\MailboxHeader; /** * Provides a Mail plugin manager. @@ -256,12 +255,9 @@ public function doMail($module, $key, $to, $langcode, $params = [], $reply = NUL // To prevent email from looking like spam, the addresses in the Sender and // Return-Path headers should have a domain authorized to use the // originating SMTP server. - $headers['From'] = $headers['Sender'] = $headers['Return-Path'] = $site_mail; + $headers['Sender'] = $headers['Return-Path'] = $site_mail; // Make sure the site-name is a RFC-2822 compliant 'display-name'. - if ($site_mail) { - $mailbox = new MailboxHeader('From', new Address($site_mail, $site_config->get('name') ?: '')); - $headers['From'] = $mailbox->getBodyAsString(); - } + $headers['From'] = MailHelper::formatDisplayName($site_config->get('name')) . ' <' . $site_mail . '>'; if ($reply) { $headers['Reply-to'] = $reply; } diff --git a/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php b/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php index 138257b8da..27e5c76e5d 100644 --- a/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php +++ b/core/lib/Drupal/Core/Mail/Plugin/Mail/PhpMail.php @@ -2,11 +2,10 @@ namespace Drupal\Core\Mail\Plugin\Mail; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Mail\MailFormatHelper; use Drupal\Core\Mail\MailInterface; use Drupal\Core\Site\Settings; -use Symfony\Component\Mime\Header\Headers; -use Symfony\Component\Mime\Header\UnstructuredHeader; /** * Defines the default Drupal mail backend, using PHP's native mail() function. @@ -19,13 +18,6 @@ */ class PhpMail implements MailInterface { - /** - * A list of headers that can contain multiple email addresses. - * - * @see \Symfony\Component\Mime\Header\Headers::HEADER_CLASS_MAP - */ - private const MAILBOX_LIST_HEADERS = ['from', 'to', 'reply-to', 'cc', 'bcc']; - /** * The configuration factory. * @@ -83,17 +75,13 @@ public function mail(array $message) { unset($message['headers']['Return-Path']); } } - - $headers = new Headers(); + $mimeheaders = []; foreach ($message['headers'] as $name => $value) { - if (in_array(strtolower($name), self::MAILBOX_LIST_HEADERS, TRUE)) { - $value = explode(',', $value); - } - $headers->addHeader($name, $value); + $mimeheaders[] = $name . ': ' . Unicode::mimeHeaderEncode($value); } $line_endings = Settings::get('mail_line_endings', PHP_EOL); // Prepare mail commands. - $mail_subject = (new UnstructuredHeader('subject', $message['subject']))->getBodyAsString(); + $mail_subject = Unicode::mimeHeaderEncode($message['subject']); // Note: email uses CRLF for line-endings. PHP's API requires LF // on Unix and CRLF on Windows. Drupal automatically guesses the // line-ending format appropriate for your system. If you need to @@ -101,8 +89,7 @@ public function mail(array $message) { $mail_body = preg_replace('@\r?\n@', $line_endings, $message['body']); // For headers, PHP's API suggests that we use CRLF normally, // but some MTAs incorrectly replace LF with CRLF. See #234403. - $mail_headers = str_replace("\r\n", "\n", $headers->toString()); - $mail_subject = str_replace("\r\n", "\n", $mail_subject); + $mail_headers = implode("\n", $mimeheaders); $request = \Drupal::request(); diff --git a/core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php b/core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php index 77fc33557d..c445d8507c 100644 --- a/core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php +++ b/core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php @@ -61,7 +61,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch $title = isset($main_content['#title']) ? $main_content['#title'] : $this->titleResolver->getTitle($request, $route_match->getRouteObject()); // Determine the dialog options and the target for the OpenDialogCommand. - $options = $request->request->all('dialogOptions'); + $options = $request->request->get('dialogOptions', []); $target = $this->determineTargetSelector($options, $route_match); $response->addCommand(new OpenDialogCommand($target, $title, $content, $options)); diff --git a/core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php b/core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php index 6f6d117332..d250d57329 100644 --- a/core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php +++ b/core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php @@ -31,7 +31,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch // Determine the title: use the title provided by the main content if any, // otherwise get it from the routing information. - $options = $request->request->all('dialogOptions'); + $options = $request->request->get('dialogOptions', []); $response->addCommand(new OpenModalDialogCommand($title, $content, $options)); return $response; diff --git a/core/lib/Drupal/Core/Render/MainContent/OffCanvasRenderer.php b/core/lib/Drupal/Core/Render/MainContent/OffCanvasRenderer.php index dc575a5fc2..086e84f929 100644 --- a/core/lib/Drupal/Core/Render/MainContent/OffCanvasRenderer.php +++ b/core/lib/Drupal/Core/Render/MainContent/OffCanvasRenderer.php @@ -64,7 +64,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch // Determine the title: use the title provided by the main content if any, // otherwise get it from the routing information. - $options = $request->request->all('dialogOptions'); + $options = $request->request->get('dialogOptions', []); $response->addCommand(new OpenOffCanvasDialogCommand($title, $content, $options, NULL, $this->position)); return $response; } diff --git a/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php b/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php index 1c19472df8..5cd2ee3057 100644 --- a/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php +++ b/core/lib/Drupal/Core/Theme/AjaxBasePageNegotiator.php @@ -65,7 +65,7 @@ public function __construct(CsrfTokenGenerator $token_generator, ConfigFactoryIn * {@inheritdoc} */ public function applies(RouteMatchInterface $route_match) { - $ajax_page_state = $this->requestStack->getCurrentRequest()->request->all('ajax_page_state'); + $ajax_page_state = $this->requestStack->getCurrentRequest()->request->get('ajax_page_state'); return !empty($ajax_page_state['theme']) && isset($ajax_page_state['theme_token']); } @@ -73,7 +73,7 @@ public function applies(RouteMatchInterface $route_match) { * {@inheritdoc} */ public function determineActiveTheme(RouteMatchInterface $route_match) { - $ajax_page_state = $this->requestStack->getCurrentRequest()->request->all('ajax_page_state'); + $ajax_page_state = $this->requestStack->getCurrentRequest()->request->get('ajax_page_state'); $theme = $ajax_page_state['theme']; $token = $ajax_page_state['theme_token']; diff --git a/core/misc/cspell/dictionary.txt b/core/misc/cspell/dictionary.txt index c9966e95a9..9e4aa28199 100644 --- a/core/misc/cspell/dictionary.txt +++ b/core/misc/cspell/dictionary.txt @@ -907,6 +907,7 @@ middlewares midgardmvc mikey milli +mimeheaders mimetypes minifyzombies minimatch diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 9ad36259a3..e551a4eb05 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -12,6 +12,7 @@ use Drupal\comment\CommentInterface; use Drupal\comment\Entity\CommentType; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; use Drupal\Core\Entity\Entity\EntityViewMode; @@ -72,13 +73,13 @@ function comment_help($route_name, RouteMatchInterface $route_match) { * Entity URI callback. */ function comment_uri(CommentInterface $comment) { - return new Url( - 'entity.comment.canonical', - [ - 'comment' => $comment->id(), - ], - ['fragment' => 'comment-' . $comment->id()] - ); + $comment_permalink = $comment->permalink(); + if ($comment->hasField('comment_body') && ($body = $comment->get('comment_body')->value)) { + $attributes = $comment_permalink->getOption('attributes') ?: []; + $attributes += ['title' => Unicode::truncate($body, 128)]; + $comment_permalink->setOption('attributes', $attributes); + } + return $comment_permalink; } /** diff --git a/core/modules/comment/src/Controller/CommentController.php b/core/modules/comment/src/Controller/CommentController.php index ee4368b0d4..2cba4ac918 100644 --- a/core/modules/comment/src/Controller/CommentController.php +++ b/core/modules/comment/src/Controller/CommentController.php @@ -337,11 +337,11 @@ public function renderNewCommentsNodeLinks(Request $request) { throw new AccessDeniedHttpException(); } - if (!$request->request->has('node_ids') || !$request->request->has('field_name')) { + $nids = $request->request->get('node_ids'); + $field_name = $request->request->get('field_name'); + if (!isset($nids)) { throw new NotFoundHttpException(); } - $nids = $request->request->all('node_ids'); - $field_name = $request->request->get('field_name'); // Only handle up to 100 nodes. $nids = array_slice($nids, 0, 100); diff --git a/core/modules/comment/tests/src/Functional/CommentBlockTest.php b/core/modules/comment/tests/src/Functional/CommentBlockTest.php index 29ebe8f9c8..bd3b54481c 100644 --- a/core/modules/comment/tests/src/Functional/CommentBlockTest.php +++ b/core/modules/comment/tests/src/Functional/CommentBlockTest.php @@ -73,6 +73,7 @@ public function testRecentCommentBlock() { $this->assertNoText($comments[10]->getSubject()); for ($i = 0; $i < 10; $i++) { $this->assertSession()->pageTextContains($comments[$i]->getSubject()); + $this->assertSession()->linkByHrefExists($comments[$i]->permalink()->toString()); if ($i > 1) { $previous_position = $position; $position = strpos($this->getSession()->getPage()->getContent(), $comments[$i]->getSubject()); diff --git a/core/modules/contextual/src/ContextualController.php b/core/modules/contextual/src/ContextualController.php index 378b5236c4..cd6ddb40a8 100644 --- a/core/modules/contextual/src/ContextualController.php +++ b/core/modules/contextual/src/ContextualController.php @@ -60,15 +60,15 @@ public static function create(ContainerInterface $container) { * @see contextual_preprocess() */ public function render(Request $request) { - if (!$request->request->has('ids')) { + $ids = $request->request->get('ids'); + if (!isset($ids)) { throw new BadRequestHttpException('No contextual ids specified.'); } - $ids = $request->request->all('ids'); - if (!$request->request->has('tokens')) { + $tokens = $request->request->get('tokens'); + if (!isset($tokens)) { throw new BadRequestHttpException('No contextual ID tokens specified.'); } - $tokens = $request->request->all('tokens'); $rendered = []; foreach ($ids as $key => $id) { diff --git a/core/modules/field_ui/src/Form/FieldConfigEditForm.php b/core/modules/field_ui/src/Form/FieldConfigEditForm.php index 7503568129..db8122c4d9 100644 --- a/core/modules/field_ui/src/Form/FieldConfigEditForm.php +++ b/core/modules/field_ui/src/Form/FieldConfigEditForm.php @@ -206,7 +206,7 @@ public function save(array $form, FormStateInterface $form_state) { $this->messenger()->addStatus($this->t('Saved %label configuration.', ['%label' => $this->entity->getLabel()])); $request = $this->getRequest(); - if (($destinations = $request->query->all('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) { + if (($destinations = $request->query->get('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) { $request->query->remove('destinations'); $form_state->setRedirectUrl($next_destination); } diff --git a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php index a8ea75d598..bf1994c1f9 100644 --- a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php +++ b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php @@ -229,7 +229,7 @@ public function save(array $form, FormStateInterface $form_state) { $this->entity->save(); $this->messenger()->addStatus($this->t('Updated field %label field settings.', ['%label' => $field_label])); $request = $this->getRequest(); - if (($destinations = $request->query->all('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) { + if (($destinations = $request->query->get('destinations')) && $next_destination = FieldUI::getNextDestination($destinations)) { $request->query->remove('destinations'); $form_state->setRedirectUrl($next_destination); } diff --git a/core/modules/history/src/Controller/HistoryController.php b/core/modules/history/src/Controller/HistoryController.php index ca3498ead8..c6a4834903 100644 --- a/core/modules/history/src/Controller/HistoryController.php +++ b/core/modules/history/src/Controller/HistoryController.php @@ -28,10 +28,10 @@ public function getNodeReadTimestamps(Request $request) { throw new AccessDeniedHttpException(); } - if (!$request->request->has('node_ids')) { + $nids = $request->request->get('node_ids'); + if (!isset($nids)) { throw new NotFoundHttpException(); } - $nids = $request->request->all('node_ids'); return new JsonResponse(history_read_multiple($nids)); } diff --git a/core/modules/jsonapi/src/Controller/EntityResource.php b/core/modules/jsonapi/src/Controller/EntityResource.php index b4124dd4d7..47bc9c056d 100644 --- a/core/modules/jsonapi/src/Controller/EntityResource.php +++ b/core/modules/jsonapi/src/Controller/EntityResource.php @@ -1217,13 +1217,13 @@ protected function entityExists(EntityInterface $entity) { */ protected function getJsonApiParams(Request $request, ResourceType $resource_type) { if ($request->query->has('filter')) { - $params[Filter::KEY_NAME] = Filter::createFromQueryParameter($request->query->all('filter'), $resource_type, $this->fieldResolver); + $params[Filter::KEY_NAME] = Filter::createFromQueryParameter($request->query->get('filter'), $resource_type, $this->fieldResolver); } if ($request->query->has('sort')) { - $params[Sort::KEY_NAME] = Sort::createFromQueryParameter($request->query->all()['sort'] ?? NULL); + $params[Sort::KEY_NAME] = Sort::createFromQueryParameter($request->query->get('sort')); } if ($request->query->has('page')) { - $params[OffsetPage::KEY_NAME] = OffsetPage::createFromQueryParameter($request->query->all('page')); + $params[OffsetPage::KEY_NAME] = OffsetPage::createFromQueryParameter($request->query->get('page')); } else { $params[OffsetPage::KEY_NAME] = OffsetPage::createFromQueryParameter(['page' => ['offset' => OffsetPage::DEFAULT_OFFSET, 'limit' => OffsetPage::SIZE_MAX]]); diff --git a/core/modules/jsonapi/src/EventSubscriber/ResourceResponseSubscriber.php b/core/modules/jsonapi/src/EventSubscriber/ResourceResponseSubscriber.php index 7a065bfd83..edf81cb677 100644 --- a/core/modules/jsonapi/src/EventSubscriber/ResourceResponseSubscriber.php +++ b/core/modules/jsonapi/src/EventSubscriber/ResourceResponseSubscriber.php @@ -146,10 +146,10 @@ protected static function generateContext(Request $request) { 'account' => NULL, 'sparse_fieldset' => NULL, ]; - if ($request->query->has('fields')) { + if ($request->query->get('fields')) { $context['sparse_fieldset'] = array_map(function ($item) { return explode(',', $item); - }, $request->query->all('fields')); + }, $request->query->get('fields')); } return $context; } diff --git a/core/modules/jsonapi/tests/src/Kernel/Controller/EntityResourceTest.php b/core/modules/jsonapi/tests/src/Kernel/Controller/EntityResourceTest.php index 0cae3b71de..5f0246f2cb 100644 --- a/core/modules/jsonapi/tests/src/Kernel/Controller/EntityResourceTest.php +++ b/core/modules/jsonapi/tests/src/Kernel/Controller/EntityResourceTest.php @@ -3,7 +3,6 @@ namespace Drupal\Tests\jsonapi\Kernel\Controller; use Drupal\Core\Field\FieldStorageDefinitionInterface; -use Drupal\Core\Http\InputBag; use Drupal\jsonapi\CacheableResourceResponse; use Drupal\jsonapi\ResourceType\ResourceType; use Drupal\jsonapi\JsonApiResource\Data; @@ -14,6 +13,7 @@ use Drupal\user\Entity\Role; use Drupal\user\Entity\User; use Drupal\user\RoleInterface; +use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; /** @@ -186,7 +186,7 @@ protected function createEntityResource() { */ public function testGetPagedCollection() { $request = Request::create('/jsonapi/node/article'); - $request->query = new InputBag([ + $request->query = new ParameterBag([ 'sort' => 'nid', 'page' => [ 'offset' => 1, @@ -215,7 +215,7 @@ public function testGetPagedCollection() { */ public function testGetEmptyCollection() { $request = Request::create('/jsonapi/node/article'); - $request->query = new InputBag(['filter' => ['id' => 'invalid']]); + $request->query = new ParameterBag(['filter' => ['id' => 'invalid']]); // Get the response. $resource_type = new ResourceType('node', 'article', NULL); diff --git a/core/modules/media_library/src/MediaLibraryState.php b/core/modules/media_library/src/MediaLibraryState.php index 63e29e09ac..e1fd6e2e8b 100644 --- a/core/modules/media_library/src/MediaLibraryState.php +++ b/core/modules/media_library/src/MediaLibraryState.php @@ -3,9 +3,7 @@ namespace Drupal\media_library; use Drupal\Component\Utility\Crypt; -use Drupal\Core\Http\InputBag; use Drupal\Core\Site\Settings; -use Symfony\Component\HttpFoundation\InputBag as SymfonyInputBag; use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -96,20 +94,15 @@ public static function create($opener_id, array $allowed_media_type_ids, $select */ public static function fromRequest(Request $request) { $query = $request->query; - // Replace ParameterBag with InputBag for compatibility with Symfony 5. - // @todo Remove this when Symfony 4 is no longer supported. - if (!($query instanceof InputBag || $query instanceof SymfonyInputBag)) { - $query = new InputBag($query->all()); - } // Create a MediaLibraryState object through the create method to make sure // all validation runs. $state = static::create( $query->get('media_library_opener_id'), - $query->all('media_library_allowed_types'), + $query->get('media_library_allowed_types', []), $query->get('media_library_selected_type'), $query->get('media_library_remaining'), - $query->all('media_library_opener_parameters') + $query->get('media_library_opener_parameters', []) ); // The request parameters need to contain a valid hash to prevent a @@ -229,7 +222,7 @@ public function getOpenerId() { * The media type IDs. */ public function getAllowedTypeIds() { - return $this->all('media_library_allowed_types'); + return $this->get('media_library_allowed_types'); } /** @@ -273,29 +266,7 @@ public function getAvailableSlots() { * An associative array of all opener-specific parameter values. */ public function getOpenerParameters() { - return $this->all('media_library_opener_parameters'); - } - - /** - * Returns the parameters. - * - * @param string|null $key - * The name of the parameter to return or null to get them all. - * - * @return array - * An array of parameters. - */ - public function all(string $key = NULL): array { - if ($key === NULL) { - return $this->parameters; - } - - $value = $this->parameters[$key] ?? []; - if (!is_array($value)) { - throw new \UnexpectedValueException(sprintf('Unexpected value for parameter "%s": expecting "array", got "%s".', $key, get_debug_type($value))); - } - - return $value; + return $this->get('media_library_opener_parameters', []); } } diff --git a/core/modules/menu_ui/src/Controller/MenuController.php b/core/modules/menu_ui/src/Controller/MenuController.php index e76ff6c560..7958c101ac 100644 --- a/core/modules/menu_ui/src/Controller/MenuController.php +++ b/core/modules/menu_ui/src/Controller/MenuController.php @@ -50,7 +50,7 @@ public static function create(ContainerInterface $container) { */ public function getParentOptions(Request $request) { $available_menus = []; - if ($menus = $request->request->all('menus')) { + if ($menus = $request->request->get('menus')) { foreach ($menus as $menu) { $available_menus[$menu] = $menu; } diff --git a/core/modules/quickedit/src/QuickEditController.php b/core/modules/quickedit/src/QuickEditController.php index d5967090b0..bc81769cdb 100644 --- a/core/modules/quickedit/src/QuickEditController.php +++ b/core/modules/quickedit/src/QuickEditController.php @@ -116,11 +116,11 @@ public static function create(ContainerInterface $container) { * The JSON response. */ public function metadata(Request $request) { - if (!$request->request->has('fields')) { + $fields = $request->request->get('fields'); + if (!isset($fields)) { throw new NotFoundHttpException(); } - $fields = $request->request->all('fields'); - $entities = $request->request->all('entities'); + $entities = $request->request->get('entities'); $metadata = []; foreach ($fields as $field) { @@ -147,7 +147,7 @@ public function metadata(Request $request) { // If the entity information for this field is requested, include it. $entity_id = $entity->getEntityTypeId() . '/' . $entity_id; - if (in_array($entity_id, $entities, TRUE) && !isset($metadata[$entity_id])) { + if (is_array($entities) && in_array($entity_id, $entities) && !isset($metadata[$entity_id])) { $metadata[$entity_id] = $this->metadataGenerator->generateEntityMetadata($entity); } @@ -168,10 +168,10 @@ public function metadata(Request $request) { */ public function attachments(Request $request) { $response = new AjaxResponse(); - if (!$request->request->has('editors')) { + $editors = $request->request->get('editors'); + if (!isset($editors)) { throw new NotFoundHttpException(); } - $editors = $request->request->all('editors'); $response->setAttachments($this->editorSelector->getEditorAttachments($editors)); @@ -229,7 +229,7 @@ public function fieldForm(EntityInterface $entity, $field_name, $langcode, $view // Re-render the updated field for other view modes (i.e. for other // instances of the same logical field on the user's page). - $other_view_mode_ids = $request->request->all('other_view_modes'); + $other_view_mode_ids = $request->request->get('other_view_modes') ?: []; $other_view_modes = array_map($render_field_in_view_mode, array_combine($other_view_mode_ids, $other_view_mode_ids)); $response->addCommand(new FieldFormSavedCommand($output, $other_view_modes)); diff --git a/core/modules/system/tests/modules/dialog_renderer_test/src/Render/MainContent/WideModalRenderer.php b/core/modules/system/tests/modules/dialog_renderer_test/src/Render/MainContent/WideModalRenderer.php index feb5ca7ead..aecb4dd0de 100644 --- a/core/modules/system/tests/modules/dialog_renderer_test/src/Render/MainContent/WideModalRenderer.php +++ b/core/modules/system/tests/modules/dialog_renderer_test/src/Render/MainContent/WideModalRenderer.php @@ -60,7 +60,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch // Determine the title: use the title provided by the main content if any, // otherwise get it from the routing information. - $options = $request->request->all('dialogOptions'); + $options = $request->request->get('dialogOptions', []); // Override width option. switch ($this->mode) { case 'wide': diff --git a/core/modules/system/tests/src/Kernel/Mail/MailTest.php b/core/modules/system/tests/src/Kernel/Mail/MailTest.php index c6c2545694..9582084a03 100644 --- a/core/modules/system/tests/src/Kernel/Mail/MailTest.php +++ b/core/modules/system/tests/src/Kernel/Mail/MailTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\system\Kernel\Mail; use Drupal\Component\Utility\Random; +use Drupal\Component\Utility\Unicode; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Mail\MailFormatHelper; use Drupal\Core\Mail\Plugin\Mail\TestMailCollector; @@ -146,9 +147,9 @@ public function testFromAndReplyToHeader() { $captured_emails = \Drupal::state()->get('system.test_mail_collector'); $sent_message = end($captured_emails); // From header is correctly encoded. - $this->assertEquals('=?utf-8?Q?Dr=C3=A9pal?= this is a very long test sentence to test what happens with very long site names ', $sent_message['headers']['From']); + $this->assertEquals('=?UTF-8?B?RHLDqXBhbCB0aGlzIGlzIGEgdmVyeSBsb25nIHRlc3Qgc2VudGVuY2UgdG8gdGU=?= ', $sent_message['headers']['From']); // From header is correctly encoded. - $this->assertEquals('Drépal this is a very long test sentence to test what happens with very long site names ', iconv_mime_decode($sent_message['headers']['From'])); + $this->assertEquals('Drépal this is a very long test sentence to te ', Unicode::mimeHeaderDecode($sent_message['headers']['From'])); $this->assertFalse(isset($sent_message['headers']['Reply-to']), 'Message reply-to is not set if not specified.'); // Errors-to header must not be set, it is deprecated. $this->assertFalse(isset($sent_message['headers']['Errors-To'])); @@ -178,9 +179,9 @@ public function testFromAndReplyToHeader() { $captured_emails = \Drupal::state()->get('system.test_mail_collector'); $sent_message = end($captured_emails); // From header is correctly encoded. - $this->assertEquals('=?utf-8?Q?Dr=C3=A9pal=2C_=22si=5Cte=22?= ', $sent_message['headers']['From']); + $this->assertEquals('=?UTF-8?B?RHLDqXBhbCwgInNpXHRlIg==?= ', $sent_message['headers']['From']); // From header is correctly encoded. - $this->assertEquals($site_name . ' ', iconv_mime_decode($sent_message['headers']['From'])); + $this->assertEquals($site_name . ' ', Unicode::mimeHeaderDecode($sent_message['headers']['From'])); } /** diff --git a/core/modules/views/src/Plugin/views/argument_default/QueryParameter.php b/core/modules/views/src/Plugin/views/argument_default/QueryParameter.php index bb21c6baa4..1b45615fd8 100644 --- a/core/modules/views/src/Plugin/views/argument_default/QueryParameter.php +++ b/core/modules/views/src/Plugin/views/argument_default/QueryParameter.php @@ -66,7 +66,7 @@ public function getArgument() { $current_request = $this->view->getRequest(); if ($current_request->query->has($this->options['query_param'])) { - $param = $current_request->query->all()[$this->options['query_param']] ?? NULL; + $param = $current_request->query->get($this->options['query_param']); if (is_array($param)) { $conjunction = ($this->options['multiple'] == 'and') ? ',' : '+'; $param = implode($conjunction, $param); diff --git a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php index 468069f8d8..8e87252b93 100644 --- a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php +++ b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php @@ -32,7 +32,7 @@ class ComposerProjectTemplatesTest extends BuildTestBase { * * @see https://getcomposer.org/doc/04-schema.md#minimum-stability */ - protected const MINIMUM_STABILITY = 'RC'; + protected const MINIMUM_STABILITY = 'stable'; /** * The order of stability strings from least stable to most stable. diff --git a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php index 05cb76783b..78beb2bf64 100644 --- a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php +++ b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php @@ -426,14 +426,13 @@ protected function instantiateServer($port, $working_dir = NULL) { ->start(); // Wait until the web server has started. It is started if the port is no // longer available. - for ($i = 0; $i < 50; $i++) { - usleep(100000); + for ($i = 0; $i < 1000; $i++) { if (!$this->checkPortIsAvailable($port)) { return $ps; } + usleep(1000); } - - throw new \RuntimeException(sprintf("Unable to start the web server.\nCMD: %s \nCODE: %d\nSTATUS: %s\nOUTPUT:\n%s\n\nERROR OUTPUT:\n%s", $ps->getCommandLine(), $ps->getExitCode(), $ps->getStatus(), $ps->getOutput(), $ps->getErrorOutput())); + throw new \RuntimeException(sprintf("Unable to start the web server.\nERROR OUTPUT:\n%s", $ps->getErrorOutput())); } /** diff --git a/core/tests/Drupal/Tests/Component/Utility/MailTest.php b/core/tests/Drupal/Tests/Component/Utility/MailTest.php index 3c49979f6e..5f30328919 100644 --- a/core/tests/Drupal/Tests/Component/Utility/MailTest.php +++ b/core/tests/Drupal/Tests/Component/Utility/MailTest.php @@ -4,18 +4,15 @@ use Drupal\Component\Utility\Mail; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; /** * Test mail helpers implemented in Mail component. * * @group Utility - * @group legacy * * @coversDefaultClass \Drupal\Component\Utility\Mail */ class MailTest extends TestCase { - use ExpectDeprecationTrait; /** * Tests RFC-2822 'display-name' formatter. @@ -24,7 +21,6 @@ class MailTest extends TestCase { * @covers ::formatDisplayName */ public function testFormatDisplayName($string, $safe_display_name) { - $this->expectDeprecation('\Drupal\Component\Utility\Unicode::mimeHeaderEncode() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Mime\Header\UnstructuredHeader instead. See https://www.drupal.org/node/3207439'); $this->assertEquals($safe_display_name, Mail::formatDisplayName($string)); } diff --git a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php index 5315b0ed28..714078241a 100644 --- a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php +++ b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php @@ -4,7 +4,6 @@ use Drupal\Component\Utility\Unicode; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; /** * Test unicode handling features implemented in Unicode component. @@ -14,17 +13,14 @@ * @coversDefaultClass \Drupal\Component\Utility\Unicode */ class UnicodeTest extends TestCase { - use ExpectDeprecationTrait; /** * Tests multibyte encoding. * * @dataProvider providerTestMimeHeader * @covers ::mimeHeaderEncode - * @group legacy */ public function testMimeHeaderEncode($value, $encoded) { - $this->expectDeprecation('\Drupal\Component\Utility\Unicode::mimeHeaderEncode() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use \Symfony\Component\Mime\Header\UnstructuredHeader instead. See https://www.drupal.org/node/3207439'); $this->assertEquals($encoded, Unicode::mimeHeaderEncode($value)); } @@ -48,10 +44,8 @@ public function providerTestMimeHeader() { * * @dataProvider providerTestMimeHeaderDecode * @covers ::mimeHeaderDecode - * @group legacy */ public function testMimeHeaderDecode($value, $encoded) { - $this->expectDeprecation('\Drupal\Component\Utility\Unicode::mimeHeaderDecode() is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Use iconv_mime_decode() instead. See https://www.drupal.org/node/3207439'); $this->assertEquals($value, Unicode::mimeHeaderDecode($encoded)); } diff --git a/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php b/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php index 62fbcd5a71..cb65353201 100644 --- a/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php +++ b/core/tests/Drupal/Tests/Core/Theme/AjaxBasePageNegotiatorTest.php @@ -3,7 +3,6 @@ namespace Drupal\Tests\Core\Theme; use Drupal\Core\Access\CsrfTokenGenerator; -use Drupal\Core\Http\InputBag; use Drupal\Core\Routing\RouteMatch; use Drupal\Core\Theme\AjaxBasePageNegotiator; use Drupal\Tests\UnitTestCase; @@ -56,7 +55,6 @@ public function setUp(): void { */ public function testApplies($request_data, $expected) { $request = new Request([], $request_data); - $request->request = new InputBag($request->request->all()); $route_match = RouteMatch::createFromRequest($request); $this->requestStack->push($request); @@ -81,7 +79,6 @@ public function testDetermineActiveThemeValidToken() { $theme_token = 'valid_theme_token'; $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]); - $request->request = new InputBag($request->request->all()); $this->requestStack->push($request); $route_match = RouteMatch::createFromRequest($request); @@ -99,7 +96,6 @@ public function testDetermineActiveThemeInvalidToken() { $theme_token = 'invalid_theme_token'; $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]); - $request->request = new InputBag($request->request->all()); $this->requestStack->push($request); $route_match = RouteMatch::createFromRequest($request); @@ -119,7 +115,6 @@ public function testDetermineActiveThemeDefaultTheme() { $theme_token = ''; $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]); - $request->request = new InputBag($request->request->all()); $this->requestStack->push($request); $route_match = RouteMatch::createFromRequest($request);