diff -u b/core/core.services.yml b/core/core.services.yml --- b/core/core.services.yml +++ b/core/core.services.yml @@ -957,7 +957,7 @@ class: Drupal\Core\EventSubscriber\HtmlResponseSubscriber tags: - { name: event_subscriber } - arguments: ['@asset.resolver', '@config.factory', '@asset.css.collection_renderer', '@asset.js.collection_renderer', '@request_stack'] + arguments: ['@asset.resolver', '@config.factory', '@asset.css.collection_renderer', '@asset.js.collection_renderer', '@request_stack', '@renderer'] finish_response_subscriber: class: Drupal\Core\EventSubscriber\FinishResponseSubscriber tags: diff -u b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php --- b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\Core\EventSubscriber\HtmlResponseSubscriber. + * Contains Drupal\Core\EventSubscriber\HtmlResponseSubscriber. */ namespace Drupal\Core\EventSubscriber; @@ -15,6 +15,7 @@ use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Render\AttachmentsResponseInterface; use Drupal\Core\Render\HtmlResponse; +use Drupal\Core\Render\RendererInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; @@ -63,22 +64,37 @@ protected $requestStack; /** + * The renderer. + * + * @var \Drupal\Core\Render\RendererInterface + */ + protected $renderer; + + /** * Constructs a HtmlResponseSubscriber object. * + * @param \Drupal\Core\Asset\AssetResolverInterface $asset_resolver + * An asset resolver. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * A config factory for retrieving required config objects. - * + * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $css_collection_renderer + * A css collection renderer. + * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $js_collection_renderer + * A js collection renderer. + * @param \Drupal\Core\Render\RendererInterface $renderer + * The renderer. */ - public function __construct(AssetResolverInterface $asset_resolver, ConfigFactoryInterface $config_factory, AssetCollectionRendererInterface $css_collection_renderer, AssetCollectionRendererInterface $js_collection_renderer, RequestStack $request_stack) { + public function __construct(AssetResolverInterface $asset_resolver, ConfigFactoryInterface $config_factory, AssetCollectionRendererInterface $css_collection_renderer, AssetCollectionRendererInterface $js_collection_renderer, RequestStack $request_stack, RendererInterface $renderer) { $this->assetResolver = $asset_resolver; $this->config = $config_factory->get('system.performance'); $this->cssCollectionRenderer = $css_collection_renderer; $this->jsCollectionRenderer = $js_collection_renderer; $this->requestStack = $request_stack; + $this->renderer = $renderer; } /** - * Sets extra headers on HtmlResponse responses. + * Sets headers on HtmlResponse responses. * * @param Symfony\Component\HttpKernel\Event\FilterResponseEvent $event * The event to process. @@ -90,12 +106,12 @@ $response = $event->getResponse(); if ($response instanceof HtmlResponse) { - $this->prepareAttachments($response); + $this->processAttachments($response); } } /** - * Prepare attachments contained in a HtmlResponse. + * Prorcess attachments contained in a HtmlResponse. * * This renders them into HTML markup and replaces the HTML response * placeholders in the content of the response. @@ -105,7 +121,7 @@ * @param \Drupal\Core\Render\AttachmentsResponseInterface $response * The response containing attachments. */ - public function prepareAttachments(AttachmentsResponseInterface $response) { + public function processAttachments(AttachmentsResponseInterface $response) { $attached = $response->getAttachments(); // Get the placeholders from attached and then remove them. @@ -115,17 +131,16 @@ $variables = []; $variables += $this->processAssetLibraries($attached, $placeholders); - // Handle all non-asset attachments. - $all_attached = ['#attached' => $attached]; - drupal_process_attached($all_attached); - // Get HTML head elements - if present. if (isset($placeholders['head'])) { + // Handle all non-asset attachments. + $all_attached = ['#attached' => $attached]; + drupal_process_attached($all_attached); + $variables['head'] = drupal_get_html_head(FALSE); } - // Now replace the placeholders in the response content with the real - // data. + // Now replace the placeholders in the response content with the real data. $this->renderPlaceholders($response, $placeholders, $variables); // Finally set the headers on the response. @@ -194,8 +209,8 @@ */ protected function renderPlaceholders(AttachmentsResponseInterface $response, array $placeholders, array $variables) { $content = $response->getContent(); - foreach ($placeholders as $key => $placeholder) { - $content = str_replace($placeholder, render($variables[$key]), $content); + foreach ($placeholders as $type => $placeholder) { + $content = str_replace($placeholder, $this->renderer->renderPlain($variables[$type]), $content); } $response->setContent($content); }