core/core.services.yml | 1 + core/modules/big_pipe/big_pipe.services.yml | 2 +- .../src/Render/Placeholder/BigPipeStrategy.php | 31 ++++++++++++++-------- core/modules/big_pipe/src/Tests/BigPipeTest.php | 18 +++++++++++++ .../Render/Placeholder/BigPipeStrategyTest.php | 6 ++++- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/core/core.services.yml b/core/core.services.yml index 6049d3b..490c4a2 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -14,6 +14,7 @@ parameters: max-age: 0 contexts: ['session', 'user'] tags: [] + debug: false factory.keyvalue: default: keyvalue.database http.response.debug_cacheability_headers: false diff --git a/core/modules/big_pipe/big_pipe.services.yml b/core/modules/big_pipe/big_pipe.services.yml index 5235037..1dd851e 100644 --- a/core/modules/big_pipe/big_pipe.services.yml +++ b/core/modules/big_pipe/big_pipe.services.yml @@ -6,7 +6,7 @@ services: arguments: ['@big_pipe'] placeholder_strategy.big_pipe: class: Drupal\big_pipe\Render\Placeholder\BigPipeStrategy - arguments: ['@session_configuration', '@request_stack', '@current_route_match'] + arguments: ['@session_configuration', '@request_stack', '@current_route_match', '%renderer.config%'] tags: - { name: placeholder_strategy, priority: 0 } big_pipe: diff --git a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php index 686e98a..cce11ce 100644 --- a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php +++ b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php @@ -86,6 +86,13 @@ class BigPipeStrategy implements PlaceholderStrategyInterface { protected $routeMatch; /** + * The renderer configuration array. + * + * @var array + */ + protected $rendererConfig; + + /** * Constructs a new BigPipeStrategy class. * * @param \Drupal\Core\Session\SessionConfigurationInterface $session_configuration @@ -94,11 +101,14 @@ class BigPipeStrategy implements PlaceholderStrategyInterface { * The request stack. * @param \Drupal\Core\Routing\RouteMatchInterface $route_match * The current route match. + * @param array $renderer_config + * The renderer configuration array. */ - public function __construct(SessionConfigurationInterface $session_configuration, RequestStack $request_stack, RouteMatchInterface $route_match) { + public function __construct(SessionConfigurationInterface $session_configuration, RequestStack $request_stack, RouteMatchInterface $route_match, array $renderer_config) { $this->sessionConfiguration = $session_configuration; $this->requestStack = $request_stack; $this->routeMatch = $route_match; + $this->rendererConfig = $renderer_config; } /** @@ -150,16 +160,16 @@ protected function doProcessPlaceholders(array $placeholders) { // @see \Drupal\Core\Form\FormBuilder::renderFormTokenPlaceholder() // @see \Drupal\Core\Form\FormBuilder::renderPlaceholderFormAction() if ($placeholder[0] !== '<' || $placeholder !== Html::normalize($placeholder)) { - $overridden_placeholders[$placeholder] = static::createBigPipeNoJsPlaceholder($placeholder, $placeholder_elements, TRUE); + $overridden_placeholders[$placeholder] = $this->createBigPipeNoJsPlaceholder($placeholder, $placeholder_elements, TRUE); } else { // If the current request/session doesn't have JavaScript, fall back to // no-JS BigPipe. if ($this->requestStack->getCurrentRequest()->cookies->has(static::NOJS_COOKIE)) { - $overridden_placeholders[$placeholder] = static::createBigPipeNoJsPlaceholder($placeholder, $placeholder_elements, FALSE); + $overridden_placeholders[$placeholder] = $this->createBigPipeNoJsPlaceholder($placeholder, $placeholder_elements, FALSE); } else { - $overridden_placeholders[$placeholder] = static::createBigPipeJsPlaceholder($placeholder, $placeholder_elements); + $overridden_placeholders[$placeholder] = $this->createBigPipeJsPlaceholder($placeholder, $placeholder_elements); } $overridden_placeholders[$placeholder]['#cache']['contexts'][] = 'cookies:' . static::NOJS_COOKIE; } @@ -179,8 +189,8 @@ protected function doProcessPlaceholders(array $placeholders) { * @return array * The resulting BigPipe JS placeholder render array. */ - protected static function createBigPipeJsPlaceholder($original_placeholder, array $placeholder_render_array) { - $big_pipe_placeholder_id = static::generateBigPipePlaceholderId($original_placeholder, $placeholder_render_array); + protected function createBigPipeJsPlaceholder($original_placeholder, array $placeholder_render_array) { + $big_pipe_placeholder_id = $this->generateBigPipePlaceholderId($original_placeholder, $placeholder_render_array); return [ '#markup' => '
', @@ -219,9 +229,9 @@ protected static function createBigPipeJsPlaceholder($original_placeholder, arra * @return array * The resulting BigPipe no-JS placeholder render array. */ - protected static function createBigPipeNoJsPlaceholder($original_placeholder, array $placeholder_render_array, $placeholder_must_be_attribute_safe = FALSE) { + protected function createBigPipeNoJsPlaceholder($original_placeholder, array $placeholder_render_array, $placeholder_must_be_attribute_safe = FALSE) { if (!$placeholder_must_be_attribute_safe) { - $big_pipe_placeholder = ''; + $big_pipe_placeholder = ''; } else { $big_pipe_placeholder = 'big_pipe_nojs_placeholder_attribute_safe:' . Html::escape($original_placeholder); @@ -254,12 +264,11 @@ protected static function createBigPipeNoJsPlaceholder($original_placeholder, ar * @return string * The generated BigPipe placeholder ID. */ - protected static function generateBigPipePlaceholderId($original_placeholder, array $placeholder_render_array) { + protected function generateBigPipePlaceholderId($original_placeholder, array $placeholder_render_array) { // Generate a BigPipe placeholder ID (to be used by BigPipe's JavaScript). // @see \Drupal\Core\Render\PlaceholderGenerator::createPlaceholder() if (isset($placeholder_render_array['#lazy_builder'])) { - $render_config = \Drupal::container()->getParameter('renderer.config'); - $debug = !empty($render_config['debug']); + $debug = !empty($this->rendererConfig['debug']); $token = hash('crc32b', serialize($placeholder_render_array)); // When debug mode is on, generate a placeholder ID that lists the lazy diff --git a/core/modules/big_pipe/src/Tests/BigPipeTest.php b/core/modules/big_pipe/src/Tests/BigPipeTest.php index f947c46..cccb25e 100644 --- a/core/modules/big_pipe/src/Tests/BigPipeTest.php +++ b/core/modules/big_pipe/src/Tests/BigPipeTest.php @@ -48,6 +48,24 @@ protected function setUp() { // $this->maximumMetaRefreshCount and $this->metaRefreshCount. // @see doMetaRefresh() $this->maximumMetaRefreshCount = 0; + + // This does not actually work. + /* + if (!$this->isInChildSite()) { + file_put_contents($this->siteDirectory . '/settings.php', "\n\$settings['container_yamls'][] = " . $this->siteDirectory . "'/testing.services.yml';\n", FILE_APPEND); + $yaml = <<