Issue #2979317 by tstoeckler, hchonov, alexpott: Duplicate deprecation header messages break Chromedriver

merge-requests/2419/head
Alex Pott 2019-12-02 10:24:57 +00:00
parent 2d2cbce272
commit de3bb2cc24
No known key found for this signature in database
GPG Key ID: 31905460D4A69276
4 changed files with 69 additions and 9 deletions

View File

@ -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']
);
}
}
}

View File

@ -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',
];
}
}

View File

@ -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'

View File

@ -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);
}
}