Skip to content
Snippets Groups Projects
Commit 7430cc3c authored by catch's avatar catch
Browse files

Issue #3255637 by Liam Morland, 3li, joegraduate, rivimey, alexpott, mondrake,...

Issue #3255637 by Liam Morland, 3li, joegraduate, rivimey, alexpott, mondrake, ravi.shankar, hswong3i, ameymudras, longwave, Anchal_gupta, neclimdul, Martijn de Wit, sgourebi, pradhumanjainOSL, gambry, kim.pepper: Deprecate NULL values in Html::escape(), ::decodeEntities(), and FormattableMarkup::placeholderFormat() to make it easier to upgrade to PHP 8
parent 090a3c05
No related branches found
No related tags found
34 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3600Issue #3344629: Passing null to parameter #1 ($haystack) of type string is deprecated,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!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,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!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,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
...@@ -131,11 +131,11 @@ public function jsonSerialize() { ...@@ -131,11 +131,11 @@ public function jsonSerialize() {
* @param array $args * @param array $args
* An associative array of replacements. Each array key should be the same * An associative array of replacements. Each array key should be the same
* as a placeholder in $string. The corresponding value should be a string * as a placeholder in $string. The corresponding value should be a string
* or an object that implements * or an object that implements \Drupal\Component\Render\MarkupInterface.
* \Drupal\Component\Render\MarkupInterface. The value replaces the * Null args[] values are deprecated in Drupal 9.5 and will fail in
* placeholder in $string. Sanitization and formatting will be done before * Drupal 11.0. The value replaces the placeholder in $string. Sanitization
* replacement. The type of sanitization and formatting depends on the first * and formatting will be done before replacement. The type of sanitization
* character of the key: * and formatting depends on the first character of the key:
* - @variable: When the placeholder replacement value is: * - @variable: When the placeholder replacement value is:
* - A string, the replaced value in the returned string will be sanitized * - A string, the replaced value in the returned string will be sanitized
* using \Drupal\Component\Utility\Html::escape(). * using \Drupal\Component\Utility\Html::escape().
...@@ -196,6 +196,14 @@ public function jsonSerialize() { ...@@ -196,6 +196,14 @@ public function jsonSerialize() {
protected static function placeholderFormat($string, array $args) { protected static function placeholderFormat($string, array $args) {
// Transform arguments before inserting them. // Transform arguments before inserting them.
foreach ($args as $key => $value) { foreach ($args as $key => $value) {
if (is_null($value)) {
// It's probably a bug to provide a null value for the placeholder arg,
// and in D11 this will no longer be allowed. When this trigger_error
// is removed, also remove isset $value checks inside the switch{}
// below.
@trigger_error(sprintf('Deprecated NULL placeholder value for key (%s) in: "%s". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826', (string) $key, (string) $string), E_USER_DEPRECATED);
$value = '';
}
switch ($key[0]) { switch ($key[0]) {
case '@': case '@':
// Escape if the value is not an object from a class that implements // Escape if the value is not an object from a class that implements
......
...@@ -382,7 +382,11 @@ public static function escapeCdataElement(\DOMNode $node, $comment_start = '//', ...@@ -382,7 +382,11 @@ public static function escapeCdataElement(\DOMNode $node, $comment_start = '//',
* @see html_entity_decode() * @see html_entity_decode()
* @see \Drupal\Component\Utility\Html::escape() * @see \Drupal\Component\Utility\Html::escape()
*/ */
public static function decodeEntities($text) { public static function decodeEntities($text): string {
if (is_null($text)) {
@trigger_error('Passing NULL to ' . __METHOD__ . ' is deprecated in drupal:9.5.0 and will trigger a PHP error from drupal:11.0.0. Pass a string instead. See https://www.drupal.org/node/3318826', E_USER_DEPRECATED);
return '';
}
return html_entity_decode($text, ENT_QUOTES, 'UTF-8'); return html_entity_decode($text, ENT_QUOTES, 'UTF-8');
} }
...@@ -420,7 +424,11 @@ public static function decodeEntities($text) { ...@@ -420,7 +424,11 @@ public static function decodeEntities($text) {
* *
* @ingroup sanitization * @ingroup sanitization
*/ */
public static function escape($text) { public static function escape($text): string {
if (is_null($text)) {
@trigger_error('Passing NULL to ' . __METHOD__ . ' is deprecated in drupal:9.5.0 and will trigger a PHP error from drupal:11.0.0. Pass a string instead. See https://www.drupal.org/node/3318826', E_USER_DEPRECATED);
return '';
}
return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
} }
......
...@@ -52,6 +52,29 @@ public function testCount() { ...@@ -52,6 +52,29 @@ public function testCount() {
$this->assertEquals(strlen($string), $formattable_string->count()); $this->assertEquals(strlen($string), $formattable_string->count());
} }
/**
* @covers ::__toString
* @dataProvider providerTestNullPlaceholder
* @group legacy
*/
public function testNullPlaceholder(string $expected, string $string, array $arguments, string $expected_deprecation): void {
$this->expectDeprecation($expected_deprecation);
$this->assertEquals($expected, (string) new FormattableMarkup($string, $arguments));
}
/**
* Data provider for FormattableMarkupTest::testNullPlaceholder().
*
* @return array
*/
public function providerTestNullPlaceholder() {
return [
['', '@empty', ['@empty' => NULL], 'Deprecated NULL placeholder value for key (@empty) in: "@empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'],
['', ':empty', [':empty' => NULL], 'Deprecated NULL placeholder value for key (:empty) in: ":empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'],
['<em class="placeholder"></em>', '%empty', ['%empty' => NULL], 'Deprecated NULL placeholder value for key (%%empty) in: "%%empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'],
];
}
/** /**
* Custom error handler that saves the last error. * Custom error handler that saves the last error.
* *
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
use Drupal\Component\Utility\Html; use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Random; use Drupal\Component\Utility\Random;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
/** /**
* Tests \Drupal\Component\Utility\Html. * Tests \Drupal\Component\Utility\Html.
...@@ -17,6 +18,8 @@ ...@@ -17,6 +18,8 @@
*/ */
class HtmlTest extends TestCase { class HtmlTest extends TestCase {
use ExpectDeprecationTrait;
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
...@@ -405,6 +408,19 @@ public function providerTestTransformRootRelativeUrlsToAbsoluteAssertion() { ...@@ -405,6 +408,19 @@ public function providerTestTransformRootRelativeUrlsToAbsoluteAssertion() {
]; ];
} }
/**
* Test deprecations.
*
* @group legacy
*/
public function testDeprecations(): void {
$this->expectDeprecation('Passing NULL to Drupal\Component\Utility\Html::decodeEntities is deprecated in drupal:9.5.0 and will trigger a PHP error from drupal:11.0.0. Pass a string instead. See https://www.drupal.org/node/3318826');
$this->assertSame('', Html::decodeEntities(NULL));
$this->expectDeprecation('Passing NULL to Drupal\Component\Utility\Html::escape is deprecated in drupal:9.5.0 and will trigger a PHP error from drupal:11.0.0. Pass a string instead. See https://www.drupal.org/node/3318826');
$this->assertSame('', Html::escape(NULL));
}
} }
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment