core/lib/Drupal/Core/Render/Renderer.php | 29 +++++++++++++++------- .../Drupal/Tests/Core/Render/RendererTest.php | 5 +--- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php index 40a2a9e..78e2deb 100644 --- a/core/lib/Drupal/Core/Render/Renderer.php +++ b/core/lib/Drupal/Core/Render/Renderer.php @@ -174,15 +174,6 @@ protected function doRender(&$elements, $is_root_call = FALSE) { } static::$stack->push(new BubbleableMetadata()); - // Bubbleable rendering metadata that has configurable defaults. - $required_cache_contexts = $this->rendererConfig['required_cache_contexts']; - if (isset($elements['#cache']['contexts'])) { - $elements['#cache']['contexts'] = Cache::mergeContexts($elements['#cache']['contexts'], $required_cache_contexts); - } - else { - $elements['#cache']['contexts'] = $required_cache_contexts; - } - // Try to fetch the prerendered element from cache, run any // #post_render_cache callbacks and return the final markup. $pre_bubbling_cid = NULL; @@ -235,11 +226,23 @@ protected function doRender(&$elements, $is_root_call = FALSE) { } // Defaults for bubbleable rendering metadata. + $elements['#cache']['contexts'] = isset($elements['#cache']['contexts']) ? $elements['#cache']['contexts'] : array(); $elements['#cache']['tags'] = isset($elements['#cache']['tags']) ? $elements['#cache']['tags'] : array(); $elements['#cache']['max-age'] = isset($elements['#cache']['max-age']) ? $elements['#cache']['max-age'] : Cache::PERMANENT; $elements['#attached'] = isset($elements['#attached']) ? $elements['#attached'] : array(); $elements['#post_render_cache'] = isset($elements['#post_render_cache']) ? $elements['#post_render_cache'] : array(); + // Bubbleable rendering metadata that has configurable defaults + if ($is_root_call) { + $required_cache_contexts = $this->rendererConfig['required_cache_contexts']; + if (!empty($elements['#cache']['contexts'])) { + $elements['#cache']['contexts'] = Cache::mergeContexts($elements['#cache']['contexts'], $required_cache_contexts); + } + else { + $elements['#cache']['contexts'] = $required_cache_contexts; + } + } + // Allow #pre_render to abort rendering. if (!empty($elements['#printed'])) { // The #printed element contains all the bubbleable rendering metadata for @@ -747,6 +750,14 @@ protected function createCacheID(array $elements) { if (isset($elements['#cache']['keys'])) { $cid_parts = $elements['#cache']['keys']; + // Include the required cache contexts in the cache ID. + $required_cache_contexts = $this->rendererConfig['required_cache_contexts']; + if (!empty($elements['#cache']['contexts'])) { + $elements['#cache']['contexts'] = Cache::mergeContexts($elements['#cache']['contexts'], $required_cache_contexts); + } + else { + $elements['#cache']['contexts'] = $required_cache_contexts; + } if (!empty($elements['#cache']['contexts'])) { $contexts = $this->cacheContexts->convertTokensToKeys($elements['#cache']['contexts']); $cid_parts = array_merge($cid_parts, $contexts); diff --git a/core/tests/Drupal/Tests/Core/Render/RendererTest.php b/core/tests/Drupal/Tests/Core/Render/RendererTest.php index dbcb7fa..59977cb 100644 --- a/core/tests/Drupal/Tests/Core/Render/RendererTest.php +++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php @@ -19,10 +19,7 @@ class RendererTest extends RendererTestBase { protected $defaultThemeVars = [ '#cache' => [ - 'contexts' => [ - 'languages:language_interface', - 'theme', - ], + 'contexts' => [], 'tags' => [], 'max-age' => Cache::PERMANENT, ],