diff -u b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php --- b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumBreadcrumbBuilderBaseTest.php @@ -7,8 +7,10 @@ namespace Drupal\Tests\forum\Unit\Breadcrumb; +use Drupal\Core\Cache\Cache; use Drupal\Core\Link; use Drupal\Tests\UnitTestCase; +use Symfony\Component\DependencyInjection\Container; /** * @coversDefaultClass \Drupal\forum\Breadcrumb\ForumBreadcrumbBuilderBase @@ -17,6 +19,22 @@ class ForumBreadcrumbBuilderBaseTest extends UnitTestCase { /** + * {@inheritdoc} + */ + public function setUp() { + parent::setUp(); + + $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager') + ->disableOriginalConstructor() + ->getMock(); + $cache_contexts_manager->expects($this->any()) + ->method('validate_tokens'); + $container = new Container(); + $container->set('cache_contexts_manager', $cache_contexts_manager); + \Drupal::setContainer($container); + } + + /** * Tests ForumBreadcrumbBuilderBase::__construct(). * * @covers ::__construct @@ -78,6 +96,15 @@ $vocab_item->expects($this->any()) ->method('label') ->will($this->returnValue('Fora_is_the_plural_of_forum')); + $vocab_item->expects($this->once()) + ->method('getCacheTags') + ->willReturn([]); + $vocab_item->expects($this->once()) + ->method('getCacheContexts') + ->willReturn([]); + $vocab_item->expects($this->once()) + ->method('getCacheMaxAge') + ->willReturn(Cache::PERMANENT); $vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface'); $vocab_storage->expects($this->any()) diff -u b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php --- b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumListingBreadcrumbBuilderTest.php @@ -7,6 +7,7 @@ namespace Drupal\Tests\forum\Unit\Breadcrumb; +use Drupal\Core\Cache\Cache; use Drupal\Core\Link; use Drupal\Tests\UnitTestCase; use Symfony\Cmf\Component\Routing\RouteObjectInterface; @@ -19,6 +20,22 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase { /** + * {@inheritdoc} + */ + public function setUp() { + parent::setUp(); + + $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager') + ->disableOriginalConstructor() + ->getMock(); + $cache_contexts_manager->expects($this->any()) + ->method('validate_tokens'); + $container = new Container(); + $container->set('cache_contexts_manager', $cache_contexts_manager); + \Drupal::setContainer($container); + } + + /** * Tests ForumListingBreadcrumbBuilder::applies(). * * @param bool $expected @@ -115,6 +132,7 @@ $term1->expects($this->any()) ->method('id') ->will($this->returnValue(1)); + $this->addEmptyCacheableMetadata($term1); $term2 = $this->getMockBuilder('Drupal\taxonomy\Entity\Term') ->disableOriginalConstructor() @@ -125,6 +143,7 @@ $term2->expects($this->any()) ->method('id') ->will($this->returnValue(2)); + $this->addEmptyCacheableMetadata($term2); $forum_manager = $this->getMock('Drupal\forum\ForumManagerInterface'); $forum_manager->expects($this->at(0)) @@ -139,6 +158,7 @@ $vocab_item->expects($this->any()) ->method('label') ->will($this->returnValue('Fora_is_the_plural_of_forum')); + $this->addEmptyCacheableMetadata($vocab_item); $vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface'); $vocab_storage->expects($this->any()) ->method('load') @@ -172,13 +192,6 @@ ) ); - $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager') - ->disableOriginalConstructor() - ->getMock(); - $container = new Container(); - $container->set('cache_contexts_manager', $cache_contexts_manager); - \Drupal::setContainer($container); - // Add a translation manager for t(). $translation_manager = $this->getStringTranslationStub(); $breadcrumb_builder->setStringTranslation($translation_manager); @@ -191,6 +204,7 @@ $forum_listing->expects($this->any()) ->method('label') ->will($this->returnValue('You_should_not_see_this')); + $this->addEmptyCacheableMetadata($forum_listing); // Our data set. $route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface'); @@ -219,2 +233,19 @@ + /** + * Adds empty CacheableMetadata for objects. + * + * @param \PHPUnit_Framework_MockObject_MockObject $object + */ + protected function addEmptyCacheableMetadata(&$object) { + $object->expects($this->any()) + ->method('getCacheTags') + ->willReturn([]); + $object->expects($this->any()) + ->method('getCacheContexts') + ->willReturn([]); + $object->expects($this->any()) + ->method('getCacheMaxAge') + ->willReturn(Cache::PERMANENT); + } + } diff -u b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php --- b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php +++ b/core/modules/forum/tests/src/Unit/Breadcrumb/ForumNodeBreadcrumbBuilderTest.php @@ -7,6 +7,7 @@ namespace Drupal\Tests\forum\Unit\Breadcrumb; +use Drupal\Core\Cache\Cache; use Drupal\Core\Link; use Drupal\Tests\UnitTestCase; use Symfony\Component\DependencyInjection\Container; @@ -18,6 +19,22 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase { /** + * {@inheritdoc} + */ + public function setUp() { + parent::setUp(); + + $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager') + ->disableOriginalConstructor() + ->getMock(); + $cache_contexts_manager->expects($this->any()) + ->method('validate_tokens'); + $container = new Container(); + $container->set('cache_contexts_manager', $cache_contexts_manager); + \Drupal::setContainer($container); + } + + /** * Tests ForumNodeBreadcrumbBuilder::applies(). * * @param bool $expected @@ -121,6 +138,7 @@ $term1->expects($this->any()) ->method('id') ->will($this->returnValue(1)); + $this->addEmptyCacheableMetadata($term1); $term2 = $this->getMockBuilder('Drupal\Core\Entity\EntityInterface') ->disableOriginalConstructor() @@ -131,6 +149,7 @@ $term2->expects($this->any()) ->method('id') ->will($this->returnValue(2)); + $this->addEmptyCacheableMetadata($term2); $forum_manager = $this->getMockBuilder('Drupal\forum\ForumManagerInterface') ->disableOriginalConstructor() @@ -146,6 +165,7 @@ $vocab_item->expects($this->any()) ->method('label') ->will($this->returnValue('Forums')); + $this->addEmptyCacheableMetadata($vocab_item); $vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface'); $vocab_storage->expects($this->any()) ->method('load') @@ -179,13 +199,6 @@ ) ); - $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager') - ->disableOriginalConstructor() - ->getMock(); - $container = new Container(); - $container->set('cache_contexts_manager', $cache_contexts_manager); - \Drupal::setContainer($container); - // Add a translation manager for t(). $translation_manager = $this->getStringTranslationStub(); $property = new \ReflectionProperty('Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder', 'stringTranslation'); @@ -224,2 +237,19 @@ + /** + * Adds empty CacheableMetadata for objects. + * + * @param \PHPUnit_Framework_MockObject_MockObject $object + */ + protected function addEmptyCacheableMetadata(&$object) { + $object->expects($this->any()) + ->method('getCacheTags') + ->willReturn([]); + $object->expects($this->any()) + ->method('getCacheContexts') + ->willReturn([]); + $object->expects($this->any()) + ->method('getCacheMaxAge') + ->willReturn(Cache::PERMANENT); + } + } diff -u b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php --- b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php +++ b/core/modules/taxonomy/src/TermBreadcrumbBuilder.php @@ -31,7 +31,7 @@ /** * The taxonomy storage. * - * @var \Drupal\Core\Entity\EntityStorageInterface + * @var \Drupal\Core\Entity\TermStorageInterface */ protected $termStorage; @@ -68,8 +68,10 @@ // @todo This overrides any other possible breadcrumb and is a pure // hard-coded presumption. Make this behavior configurable per // vocabulary or term. - while (array_reverse($parents = $this->termStorage->loadParents($term->id()))) { - $term = array_shift($parents); + $parents = $this->termStorage->loadAllParents($term->id()); + // Remove current term being accessed. + array_shift($parents); + foreach (array_reverse($parents) as $term) { $term = $this->entityManager->getTranslationFromContext($term); $breadcrumb->addCacheableDependency($term); $breadcrumb->addLink(Link::createFromRoute($term->getName(), 'entity.taxonomy_term.canonical', array('taxonomy_term' => $term->id()))); only in patch2: unchanged: --- a/core/modules/node/src/Tests/NodeTranslationUITest.php +++ b/core/modules/node/src/Tests/NodeTranslationUITest.php @@ -33,7 +33,8 @@ class NodeTranslationUITest extends ContentTranslationUITestBase { 'route.menu_active_trails:main', 'route.menu_active_trails:tools', 'timezone', - 'user.roles' + 'user.roles', + 'url.path', ]; /**