diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php index c539e3a..e837b18 100644 --- a/core/lib/Drupal/Core/Render/Renderer.php +++ b/core/lib/Drupal/Core/Render/Renderer.php @@ -669,9 +669,10 @@ protected function cacheSet(array &$elements, array $pre_bubbling_elements) { // and render caching of forms prevents this from happening. // @todo remove the isMethodSafe() check when // https://www.drupal.org/node/2367555 lands. - if (!$this->requestStack->getCurrentRequest()->isMethodSafe() || !$cid = $this->createCacheID($elements)) { + if (!$this->requestStack->getCurrentRequest()->isMethodSafe()) { return FALSE; } + $cid = $this->createCacheID($elements); $data = $this->getCacheableRenderArray($elements); @@ -682,6 +683,45 @@ protected function cacheSet(array &$elements, array $pre_bubbling_elements) { // Calculate pre_bubbling_cid. $pre_bubbling_cid = $this->createCacheID($pre_bubbling_elements); + // Placeholdering at work, check if we can placeholder. + if (!isset($pre_bubbling_elements['#cache_no_placeholder']) && $pre_bubbling_cid && ($cid || isset($pre_bubbling_elements['#pre_render_cache']))) { + // Check if we want to placeholder. + if (!empty($elements['#cache_placeholder']) || (isset($elements['#cache']['max-age']) && $elements['#cache']['max-age'] == 0)) { + $elements = $this->createRenderCacheArrayPlaceholder($pre_bubbling_elements, $elements); + + // Now update the #cache_redirect array or create it. + // @todo Consolidate logic using a helper function. + $redirect_data = [ + '#cache' => [ + 'keys' => [], + 'contexts' => [], + 'tags' => [], + ], + ]; + + if ($stored_cache_redirect = $cache->get($pre_bubbling_cid)) { + $redirect_data['#cache']['keys'] = $stored_cache_redirect->data['#cache']['keys']; + $redirect_data['#cache']['contexts'] = $stored_cache_redirect->data['#cache']['contexts']; + $redirect_data['#cache']['tags'] = $stored_cache_redirect->data['#cache']['tags']; + if (isset($stored_cache_redirect->data['#cache']['#cache_placeholder'])) { + $redirect_data['#cache_placeholder'] = $stored_cache_redirect->data['#cache_placeholder']; + } + } + if (empty($redirect_data['#cache_placeholder'])) { + $redirect_data['#cache_redirect'] = TRUE; + $redirect_data['#cache_placeholder'] = TRUE; + $cache->set($pre_bubbling_cid, $redirect_data, Cache::PERMANENT, Cache::mergeTags($redirect_data['#cache']['tags'], ['rendered'])); + } + + return; + } + } + + // Early return if $cid is empty. + if (!$cid) { + return FALSE; + } + // Two-tier caching: detect different CID post-bubbling, create redirect, // update redirect if different set of cache contexts. // @see ::doRender() @@ -819,6 +859,12 @@ protected function cacheSet(array &$elements, array $pre_bubbling_elements) { 'tags' => Cache::mergeTags($stored_cache_tags, $data['#cache']['tags']), ], ]; + + // Ensure #cache_placeholder setting remains. + if (isset($stored_cache_redirect->data['#cache']['#cache_placeholder'])) { + $redirect_data['#cache_placeholder'] = $stored_cache_redirect->data['#cache_placeholder']; + } + $cache->set($pre_bubbling_cid, $redirect_data, $expire, Cache::mergeTags($redirect_data['#cache']['tags'], ['rendered'])); } diff --git a/core/modules/system/src/Plugin/Block/SystemBrandingBlock.php b/core/modules/system/src/Plugin/Block/SystemBrandingBlock.php index f8a7ed3..a86fccc 100644 --- a/core/modules/system/src/Plugin/Block/SystemBrandingBlock.php +++ b/core/modules/system/src/Plugin/Block/SystemBrandingBlock.php @@ -186,6 +186,11 @@ public function build() { usleep(2000*1000); + // Bubble up that this is uncacheable. + $build['site_slogan']['#cache']['max-age'] = 0; + $build['site_slogan']['#cache']['contexts'] = ['user']; + $build['site_slogan']['#debug'] = TRUE; + return $build; } @@ -203,7 +208,8 @@ public function getCacheTags() { * {@inheritdoc} */ public function getCacheContexts() { - return [ 'route', 'user', 'languages' ]; + return []; + //return [ 'route', 'user', 'languages' ]; } @@ -211,6 +217,7 @@ public function getCacheContexts() { * {@inheritdoc} */ public function getCacheMaxAge() { - return 0; +// return 0; + return Cache::PERMANENT; } } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index 88f9023..4124b2f 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -776,7 +776,7 @@ function system_preprocess_block(&$variables) { } $variables['site_slogan'] = ''; if ($variables['content']['site_slogan']['#access'] && $variables['content']['site_slogan']['#markup']) { - $variables['site_slogan'] = $variables['content']['site_slogan']['#markup']; + $variables['site_slogan'] = drupal_render($variables['content']['site_slogan']); } break;