Issue #2979317 by tstoeckler, hchonov, alexpott: Duplicate deprecation header messages break Chromedriver
parent
2d2cbce272
commit
de3bb2cc24
|
@ -87,15 +87,21 @@ function _drupal_error_handler_real($error_level, $message, $filename, $line, $c
|
||||||
// If the site is a test site then fail for user deprecations so they can be
|
// If the site is a test site then fail for user deprecations so they can be
|
||||||
// caught by the deprecation error handler.
|
// caught by the deprecation error handler.
|
||||||
elseif (DRUPAL_TEST_IN_CHILD_SITE && $error_level === E_USER_DEPRECATED) {
|
elseif (DRUPAL_TEST_IN_CHILD_SITE && $error_level === E_USER_DEPRECATED) {
|
||||||
$backtrace = debug_backtrace();
|
static $seen = [];
|
||||||
$caller = Error::getLastCaller($backtrace);
|
if (array_search($message, $seen, TRUE) === FALSE) {
|
||||||
_drupal_error_header(
|
// Only report each deprecation once. Too many headers can break some
|
||||||
Markup::create(Xss::filterAdmin($message)),
|
// Chrome and web driver testing.
|
||||||
'User deprecated function',
|
$seen[] = $message;
|
||||||
$caller['function'],
|
$backtrace = debug_backtrace();
|
||||||
$caller['file'],
|
$caller = Error::getLastCaller($backtrace);
|
||||||
$caller['line']
|
_drupal_error_header(
|
||||||
);
|
Markup::create(Xss::filterAdmin($message)),
|
||||||
|
'User deprecated function',
|
||||||
|
$caller['function'],
|
||||||
|
$caller['file'],
|
||||||
|
$caller['line']
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,4 +155,17 @@ class Test {
|
||||||
return new RedirectResponse(Url::fromRoute('test_page_test.test_page', [], ['absolute' => TRUE])->toString(), 302);
|
return new RedirectResponse(Url::fromRoute('test_page_test.test_page', [], ['absolute' => TRUE])->toString(), 302);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a page while triggering deprecation notices.
|
||||||
|
*/
|
||||||
|
public function deprecations() {
|
||||||
|
// Create 2 identical deprecation messages. This should only trigger a
|
||||||
|
// single response header.
|
||||||
|
@trigger_error('Test deprecation message', E_USER_DEPRECATED);
|
||||||
|
@trigger_error('Test deprecation message', E_USER_DEPRECATED);
|
||||||
|
return [
|
||||||
|
'#markup' => 'Content that triggers deprecation messages',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,3 +114,11 @@ test_page_test.meta_refresh:
|
||||||
_controller: '\Drupal\test_page_test\Controller\Test::metaRefresh'
|
_controller: '\Drupal\test_page_test\Controller\Test::metaRefresh'
|
||||||
requirements:
|
requirements:
|
||||||
_access: 'TRUE'
|
_access: 'TRUE'
|
||||||
|
|
||||||
|
test_page_test.deprecations:
|
||||||
|
path: '/test-deprecations'
|
||||||
|
defaults:
|
||||||
|
_title: 'Page with deprecation notices'
|
||||||
|
_controller: '\Drupal\test_page_test\Controller\Test::deprecations'
|
||||||
|
requirements:
|
||||||
|
_access: 'TRUE'
|
||||||
|
|
|
@ -743,4 +743,37 @@ class BrowserTestBaseTest extends BrowserTestBase {
|
||||||
$assert->assertNoEscaped("<script>alert('Marked safe');alert(\"Marked safe\");</script>");
|
$assert->assertNoEscaped("<script>alert('Marked safe');alert(\"Marked safe\");</script>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that deprecation headers do not get duplicated.
|
||||||
|
*
|
||||||
|
* @group legacy
|
||||||
|
*
|
||||||
|
* @see \Drupal\Core\Test\HttpClientMiddleware\TestHttpClientMiddleware::__invoke()
|
||||||
|
*/
|
||||||
|
public function testDeprecationHeaders() {
|
||||||
|
$this->drupalGet('/test-deprecations');
|
||||||
|
|
||||||
|
$deprecation_messages = [];
|
||||||
|
foreach ($this->getSession()->getResponseHeaders() as $name => $values) {
|
||||||
|
if (preg_match('/^X-Drupal-Assertion-[0-9]+$/', $name, $matches)) {
|
||||||
|
foreach ($values as $value) {
|
||||||
|
// Call \Drupal\simpletest\WebTestBase::error() with the parameters from
|
||||||
|
// the header.
|
||||||
|
$parameters = unserialize(urldecode($value));
|
||||||
|
if (count($parameters) === 3) {
|
||||||
|
if ($parameters[1] === 'User deprecated function') {
|
||||||
|
$deprecation_messages[] = (string) $parameters[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertContains('Test deprecation message', $deprecation_messages);
|
||||||
|
$test_deprecation_messages = array_filter($deprecation_messages, function ($message) {
|
||||||
|
return $message === 'Test deprecation message';
|
||||||
|
});
|
||||||
|
$this->assertCount(1, $test_deprecation_messages);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue