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
|
||||
// caught by the deprecation error handler.
|
||||
elseif (DRUPAL_TEST_IN_CHILD_SITE && $error_level === E_USER_DEPRECATED) {
|
||||
$backtrace = debug_backtrace();
|
||||
$caller = Error::getLastCaller($backtrace);
|
||||
_drupal_error_header(
|
||||
Markup::create(Xss::filterAdmin($message)),
|
||||
'User deprecated function',
|
||||
$caller['function'],
|
||||
$caller['file'],
|
||||
$caller['line']
|
||||
);
|
||||
static $seen = [];
|
||||
if (array_search($message, $seen, TRUE) === FALSE) {
|
||||
// Only report each deprecation once. Too many headers can break some
|
||||
// Chrome and web driver testing.
|
||||
$seen[] = $message;
|
||||
$backtrace = debug_backtrace();
|
||||
$caller = Error::getLastCaller($backtrace);
|
||||
_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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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'
|
||||
requirements:
|
||||
_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>");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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