diff --git a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php index aee5a70..388fdff 100644 --- a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php +++ b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php @@ -8,6 +8,7 @@ namespace Drupal\responsive_image\Entity; use Drupal\Core\Config\Entity\ConfigEntityBase; +use Drupal\image\Entity\ImageStyle; use Drupal\responsive_image\ResponsiveImageStyleInterface; /** @@ -184,6 +185,23 @@ public function calculateDependencies() { foreach ($providers as $provider => $type) { $this->addDependency($type, $provider); } + // Extract all the styles from the image style mappings. + $styles = []; + foreach ($this->getImageStyleMappings() as $mapping) { + if ($mapping['image_mapping_type'] == 'sizes') { + $styles = array_merge($styles, $mapping['image_mapping']['sizes_image_styles']); + } + else { + $styles[] = $mapping['image_mapping']; + } + } + $styles = array_unique($styles); + array_walk($styles, function ($style) { + $style = ImageStyle::load($style); + if ($style) { + $this->addDependency('config', $style->getConfigDependencyName()); + } + }); return $this->dependencies; } diff --git a/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php b/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php index afbb26f..36a2577 100644 --- a/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php +++ b/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php @@ -65,8 +65,43 @@ protected function setUp() { * @covers ::calculateDependencies */ public function testCalculateDependencies() { - $entity = new ResponsiveImageStyle(array('breakpoint_group' => 'test_group')); + // Set up image style loading mock. + $image_style_small = $this->getMock('Drupal\Core\Config\Entity\ConfigEntityInterface'); + $map = [['broken_stype', NULL]]; + foreach (['small', 'medium', 'large'] as $style) { + $mock = $this->getMock('Drupal\Core\Config\Entity\ConfigEntityInterface'); + $mock->expects($this->any()) + ->method('getConfigDependencyName') + ->willReturn('image.style.' . $style); + $map[] = [$style, $mock]; + } + $storage = $this->getMock('\Drupal\Core\Config\Entity\ConfigEntityStorageInterface'); + $storage->expects($this->any()) + ->method('load') + ->willReturnMap($map); + $this->entityManager->expects($this->any()) + ->method('getStorage') + ->with('image_style') + ->willReturn($storage); + $this->entityManager->expects($this->any()) + ->method('getEntityTypeFromClass') + ->with('Drupal\image\Entity\ImageStyle') + ->willReturn('image_style'); + + $entity = new ResponsiveImageStyle(['breakpoint_group' => 'test_group']); $entity->setBreakpointGroup('test_group'); + $entity->addImageStyleMapping('test_breakpoint', '1x', ['image_mapping_type' => 'image_style', 'image_mapping' => 'small']); + $entity->addImageStyleMapping('test_breakpoint', '2x', ['image_mapping_type' => 'image_style', 'image_mapping' => 'broken_style']); + $entity->addImageStyleMapping('test_breakpoint', '2x', [ + 'image_mapping_type' => 'sizes', + 'image_mapping' => [ + 'sizes' => '(min-width:700px) 700px, 100vw', + 'sizes_image_styles' => [ + 'medium' => 'medium', + 'large' => 'large', + ], + ], + ]); $this->breakpointManager->expects($this->any()) ->method('getGroupProviders') @@ -74,8 +109,9 @@ public function testCalculateDependencies() { ->willReturn(array('bartik' => 'theme', 'toolbar' => 'module')); $dependencies = $entity->calculateDependencies(); - $this->assertContains('toolbar', $dependencies['module']); - $this->assertContains('bartik', $dependencies['theme']); + $this->assertEquals(['toolbar'], $dependencies['module']); + $this->assertEquals(['bartik'], $dependencies['theme']); + $this->assertEquals(['image.style.large', 'image.style.medium', 'image.style.small'], $dependencies['config']); } /**