core/modules/comment/src/Tests/CommentTranslationUITest.php | 1 + .../src/Tests/ContentTranslationUITestBase.php | 2 +- .../src/Tests/MenuLinkContentTranslationUITest.php | 2 +- core/modules/node/src/Tests/NodeBlockFunctionalTest.php | 11 ++++++----- core/modules/node/src/Tests/NodeTranslationUITest.php | 1 + .../smart_cache/src/EventSubscriber/SmartCacheSubscriber.php | 11 +++++++++-- .../tests/smart_cache_test/src/SmartCacheTestController.php | 2 +- core/modules/system/src/Tests/Routing/RouterTest.php | 4 +++- core/modules/system/src/Tests/System/TokenReplaceWebTest.php | 5 +++-- core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php | 2 ++ core/modules/tracker/src/Tests/TrackerTest.php | 7 ++++--- 11 files changed, 32 insertions(+), 16 deletions(-) diff --git a/core/modules/comment/src/Tests/CommentTranslationUITest.php b/core/modules/comment/src/Tests/CommentTranslationUITest.php index dc1bf9e..c18c550 100644 --- a/core/modules/comment/src/Tests/CommentTranslationUITest.php +++ b/core/modules/comment/src/Tests/CommentTranslationUITest.php @@ -40,6 +40,7 @@ class CommentTranslationUITest extends ContentTranslationUITestBase { 'theme', 'user.permissions', 'timezone', + 'url.query_args:_wrapper_format', 'url.query_args.pagers:0', 'user.roles' ]; diff --git a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php index 5faa85c..02cc0d3 100644 --- a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php +++ b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php @@ -44,7 +44,7 @@ * * @var string[] */ - protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user.permissions']; + protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'url.query_args:_wrapper_format', 'user.permissions']; /** * Tests the basic translation UI. diff --git a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php index 615da6b..f72cb29 100644 --- a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php +++ b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php @@ -20,7 +20,7 @@ class MenuLinkContentTranslationUITest extends ContentTranslationUITestBase { /** * {inheritdoc} */ - protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user.permissions', 'user.roles:authenticated']; + protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'url.query_args:_wrapper_format', 'user.permissions', 'user.roles:authenticated']; /** * Modules to enable. diff --git a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php index 13a835a..1cdb986 100644 --- a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php +++ b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php @@ -8,6 +8,7 @@ namespace Drupal\node\Tests; use Drupal\block\Entity\Block; +use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait; use Drupal\user\RoleInterface; @@ -125,7 +126,7 @@ public function testRecentNodeBlock() { $this->assertText($node3->label(), 'Node found in block.'); $this->assertText($node4->label(), 'Node found in block.'); - $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user']); + $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']); // Enable the "Powered by Drupal" block only on article nodes. $edit = [ @@ -150,16 +151,16 @@ public function testRecentNodeBlock() { $this->drupalGet(''); $label = $block->label(); $this->assertNoText($label, 'Block was not displayed on the front page.'); - $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route']); + $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route']); $this->drupalGet('node/add/article'); $this->assertText($label, 'Block was displayed on the node/add/article page.'); - $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route']); + $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route']); $this->drupalGet('node/' . $node1->id()); $this->assertText($label, 'Block was displayed on the node/N when node is of type article.'); - $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route', 'timezone']); + $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route', 'timezone']); $this->drupalGet('node/' . $node5->id()); $this->assertNoText($label, 'Block was not displayed on nodes of type page.'); - $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route', 'timezone']); + $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route', 'timezone']); $this->drupalLogin($this->adminUser); $this->drupalGet('admin/structure/block'); diff --git a/core/modules/node/src/Tests/NodeTranslationUITest.php b/core/modules/node/src/Tests/NodeTranslationUITest.php index c392750..e909618 100644 --- a/core/modules/node/src/Tests/NodeTranslationUITest.php +++ b/core/modules/node/src/Tests/NodeTranslationUITest.php @@ -27,6 +27,7 @@ class NodeTranslationUITest extends ContentTranslationUITestBase { protected $defaultCacheContexts = [ 'languages:language_interface', 'theme', + 'url.query_args:_wrapper_format', 'user.permissions', 'route.menu_active_trails:account', 'route.menu_active_trails:footer', diff --git a/core/modules/smart_cache/src/EventSubscriber/SmartCacheSubscriber.php b/core/modules/smart_cache/src/EventSubscriber/SmartCacheSubscriber.php index cc39e90..4edc76f 100644 --- a/core/modules/smart_cache/src/EventSubscriber/SmartCacheSubscriber.php +++ b/core/modules/smart_cache/src/EventSubscriber/SmartCacheSubscriber.php @@ -78,6 +78,13 @@ class SmartCacheSubscriber implements EventSubscriberInterface { 'keys' => ['response'], 'contexts' => [ 'route', + // Some routes' controllers rely on the request format (they don't have + // a separate route for each request format). Additionally, a controller + // may be returning a domain object that a KernelEvents::VIEW subscriber + // must turn into an actual response, but perhaps a format is being + // requested that the subscriber does not support. + // @see \Drupal\Core\EventSubscriber\AcceptNegotiation406::onViewDetect406() + 'request_format', ], 'bin' => 'smart_cache', ], @@ -176,8 +183,8 @@ public function onResponse(FilterResponseEvent $event) { return; } - // Embed the response object in a render array so that SmartCache is able to - // cache it, handling cache redirection for us. + // Embed the response object in a render array so that RenderCache is able + // to cache it, handling cache redirection for us. $response_as_render_array = $this->responseToRenderArray($response); $this->renderCache->set($response_as_render_array, $this->smartCacheRedirectRenderArray); diff --git a/core/modules/smart_cache/tests/smart_cache_test/src/SmartCacheTestController.php b/core/modules/smart_cache/tests/smart_cache_test/src/SmartCacheTestController.php index 9bca72d..61cc45b 100644 --- a/core/modules/smart_cache/tests/smart_cache_test/src/SmartCacheTestController.php +++ b/core/modules/smart_cache/tests/smart_cache_test/src/SmartCacheTestController.php @@ -28,7 +28,7 @@ public function response() { } /** - * A route returning a Response object. + * A route returning a CacheableResponse object. * * @return \Drupal\Core\Cache\CacheableResponseInterface * A CacheableResponseInterface object. diff --git a/core/modules/system/src/Tests/Routing/RouterTest.php b/core/modules/system/src/Tests/Routing/RouterTest.php index 207049f..86d823e 100644 --- a/core/modules/system/src/Tests/Routing/RouterTest.php +++ b/core/modules/system/src/Tests/Routing/RouterTest.php @@ -8,6 +8,7 @@ namespace Drupal\system\Tests\Routing; use Drupal\Core\Cache\Cache; +use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\Core\Language\LanguageInterface; use Drupal\simpletest\WebTestBase; use Symfony\Component\HttpFoundation\Request; @@ -32,6 +33,7 @@ class RouterTest extends WebTestBase { */ public function testFinishResponseSubscriber() { $renderer_required_cache_contexts = ['languages:' . LanguageInterface::TYPE_INTERFACE, 'theme', 'user.permissions']; + $expected_cache_contexts = Cache::mergeContexts($renderer_required_cache_contexts, ['url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT]); // Confirm that the router can get to a controller. $this->drupalGet('router_test/test1'); @@ -47,7 +49,7 @@ public function testFinishResponseSubscriber() { $this->assertRaw('test2', 'The correct string was returned because the route was successful.'); // Check expected headers from FinishResponseSubscriber. $headers = $this->drupalGetHeaders(); - $this->assertEqual($headers['x-drupal-cache-contexts'], implode(' ', $renderer_required_cache_contexts)); + $this->assertEqual($headers['x-drupal-cache-contexts'], implode(' ', $expected_cache_contexts)); $this->assertEqual($headers['x-drupal-cache-tags'], 'config:user.role.anonymous rendered'); // Confirm that the page wrapping is being added, so we're not getting a // raw body returned. diff --git a/core/modules/system/src/Tests/System/TokenReplaceWebTest.php b/core/modules/system/src/Tests/System/TokenReplaceWebTest.php index 7e9d60f..ba94e51 100644 --- a/core/modules/system/src/Tests/System/TokenReplaceWebTest.php +++ b/core/modules/system/src/Tests/System/TokenReplaceWebTest.php @@ -7,6 +7,7 @@ namespace Drupal\system\Tests\System; +use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\simpletest\WebTestBase; use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait; @@ -35,12 +36,12 @@ public function testTokens() { $this->drupalGet('token-test/' . $node->id()); $this->assertText("Tokens: {$node->id()} {$account->id()}"); $this->assertCacheTags(['node:1', 'rendered', 'user:2']); - $this->assertCacheContexts(['languages:language_interface', 'theme', 'user']); + $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']); $this->drupalGet('token-test-without-bubleable-metadata/' . $node->id()); $this->assertText("Tokens: {$node->id()} {$account->id()}"); $this->assertCacheTags(['node:1', 'rendered', 'user:2']); - $this->assertCacheContexts(['languages:language_interface', 'theme', 'user']); + $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']); } } diff --git a/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php b/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php index 277d312..759f646 100644 --- a/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php +++ b/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php @@ -8,6 +8,7 @@ namespace Drupal\toolbar\Tests; use Drupal\Core\Cache\Cache; +use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\simpletest\WebTestBase; use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait; @@ -109,6 +110,7 @@ protected function assertToolbarCacheContexts(array $cache_contexts, $message = $default_cache_contexts = [ 'languages:language_interface', 'theme', + 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, ]; $cache_contexts = Cache::mergeContexts($default_cache_contexts, $cache_contexts); diff --git a/core/modules/tracker/src/Tests/TrackerTest.php b/core/modules/tracker/src/Tests/TrackerTest.php index aaf7bad..7742cfe 100644 --- a/core/modules/tracker/src/Tests/TrackerTest.php +++ b/core/modules/tracker/src/Tests/TrackerTest.php @@ -10,6 +10,7 @@ use Drupal\comment\CommentInterface; use Drupal\comment\Tests\CommentTestTrait; use Drupal\Core\Cache\Cache; +use Drupal\Core\EventSubscriber\MainContentViewSubscriber; use Drupal\Core\Session\AccountInterface; use Drupal\field\Entity\FieldStorageConfig; use Drupal\node\Entity\Node; @@ -83,7 +84,7 @@ function testTrackerAll() { $this->assertLink(t('My recent content'), 0, 'User tab shows up on the global tracker page.'); // Assert cache contexts, specifically the pager and node access contexts. - $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user.node_grants:view', 'user.permissions', 'user.roles:authenticated']); + $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user.node_grants:view', 'user.permissions', 'user.roles:authenticated']); // Assert cache tags for the visible node, node lists and comment lists. $expected_tags = Cache::mergeTags($published->getCacheTags(), $published->getOwner()->getCacheTags()); $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'comment_list', 'rendered']); @@ -149,7 +150,7 @@ function testTrackerUser() { $this->assertText($other_published_my_comment->label(), "Nodes that the user has commented on appear in the user's tracker listing."); // Assert cache contexts. - $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user', 'user.node_grants:view']); + $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']); // Assert cache tags for the visible nodes (including owners) and node list // cache tag. $expected_tags = Cache::mergeTags($my_published->getCacheTags(), $my_published->getOwner()->getCacheTags()); @@ -158,7 +159,7 @@ function testTrackerUser() { $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'comment_list', 'rendered']); $this->assertCacheTags($expected_tags); - $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user', 'user.node_grants:view']); + $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']); $this->assertLink($my_published->label()); $this->assertNoLink($unpublished->label());