diff --git a/core/core.services.yml b/core/core.services.yml index cc45b91323434bf49b817f5818ca88fbaa23cdae..8b9d1119c30006e599b5b086aede0ce4f207c456 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1703,7 +1703,7 @@ services: Drupal\Core\Asset\LibraryDependencyResolverInterface: '@library.dependency_resolver' asset.resolver: class: Drupal\Core\Asset\AssetResolver - arguments: ['@library.discovery', '@library.dependency_resolver', '@module_handler', '@theme.manager', '@language_manager', '@cache.data'] + arguments: ['@library.discovery', '@library.dependency_resolver', '@module_handler', '@theme.manager', '@language_manager', '@cache.data', '@theme_handler'] Drupal\Core\Asset\AssetResolverInterface: '@asset.resolver' info_parser: class: Drupal\Core\Extension\InfoParser diff --git a/core/lib/Drupal/Core/Asset/AssetResolver.php b/core/lib/Drupal/Core/Asset/AssetResolver.php index fcd294a649714d4ed7fc191060ce044bf266eb01..4d42f4235984e499e92a765f4cf8301415c69cad 100644 --- a/core/lib/Drupal/Core/Asset/AssetResolver.php +++ b/core/lib/Drupal/Core/Asset/AssetResolver.php @@ -7,6 +7,7 @@ use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Extension\ModuleHandlerInterface; +use Drupal\Core\Extension\ThemeHandlerInterface; use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Theme\ThemeManagerInterface; @@ -58,6 +59,13 @@ class AssetResolver implements AssetResolverInterface { */ protected $cache; + /** + * The theme handler service. + * + * @var \Drupal\Core\Extension\ThemeHandlerInterface + */ + protected $themeHandler; + /** * Constructs a new AssetResolver instance. * @@ -73,14 +81,22 @@ class AssetResolver implements AssetResolverInterface { * The language manager. * @param \Drupal\Core\Cache\CacheBackendInterface $cache * The cache backend. + * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler + * The theme handler service. */ - public function __construct(LibraryDiscoveryInterface $library_discovery, LibraryDependencyResolverInterface $library_dependency_resolver, ModuleHandlerInterface $module_handler, ThemeManagerInterface $theme_manager, LanguageManagerInterface $language_manager, CacheBackendInterface $cache) { + public function __construct(LibraryDiscoveryInterface $library_discovery, LibraryDependencyResolverInterface $library_dependency_resolver, ModuleHandlerInterface $module_handler, ThemeManagerInterface $theme_manager, LanguageManagerInterface $language_manager, CacheBackendInterface $cache, ?ThemeHandlerInterface $theme_handler = NULL) { + if ($theme_handler === NULL) { + @trigger_error('Calling ' . __METHOD__ . ' without the $theme_handler argument is deprecated in drupal:11.1.0 and it will be required in drupal:12.0.0. See https://www.drupal.org/project/drupal/issues/3451667', E_USER_DEPRECATED); + $theme_handler = \Drupal::service('theme_handler'); + } + $this->libraryDiscovery = $library_discovery; $this->libraryDependencyResolver = $library_dependency_resolver; $this->moduleHandler = $module_handler; $this->themeManager = $theme_manager; $this->languageManager = $language_manager; $this->cache = $cache; + $this->themeHandler = $theme_handler; } /** @@ -140,10 +156,14 @@ public function getCssAssets(AttachedAssetsInterface $assets, $optimize, ?Langua if (!isset($language)) { $language = $this->languageManager->getCurrentLanguage(); } - $theme_info = $this->themeManager->getActiveTheme(); - // Add the theme name to the cache key since themes may implement - // hook_library_info_alter(). - $cid = 'css:' . $theme_info->getName() . ':' . $language->getId() . Crypt::hashBase64(serialize($libraries_to_load)) . (int) $optimize; + // Add the active theme name to the cache key since active themes may + // implement hook_library_info_alter(). + $active_theme = $this->themeManager->getActiveTheme()->getName(); + // Add the default theme name to the cache key since css generated for an + // active admin theme may include the default theme's ckeditor5-stylesheets + // and default themes may be set conditionally and dynamically. + $default_theme = $this->themeHandler->getDefault(); + $cid = 'css:' . $active_theme . ':' . $default_theme . ':' . $language->getId() . Crypt::hashBase64(serialize($libraries_to_load)) . (int) $optimize; if ($cached = $this->cache->get($cid)) { return $cached->data; } diff --git a/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php b/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php index d5e2190439a5242daa8a1e3fc55b01468b087908..4c5b49287d5966515690a07303d6f225148f59cd 100644 --- a/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php +++ b/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php @@ -67,6 +67,13 @@ class AssetResolverTest extends UnitTestCase { */ protected $cache; + /** + * The mocked theme handler. + * + * @var \Drupal\Core\Extension\ThemeHandlerInterface|\PHPUnit\Framework\MockObject\MockObject + */ + protected $themeHandler; + /** * A mocked English language object. */ @@ -161,7 +168,9 @@ protected function setUp(): void { ->willReturn($english, $english, $japanese, $japanese); $this->cache = new TestMemoryBackend(new Time()); - $this->assetResolver = new AssetResolver($this->libraryDiscovery, $this->libraryDependencyResolver, $this->moduleHandler, $this->themeManager, $this->languageManager, $this->cache); + $this->themeHandler = $this->createMock('\Drupal\Core\Extension\ThemeHandlerInterface'); + + $this->assetResolver = new AssetResolver($this->libraryDiscovery, $this->libraryDependencyResolver, $this->moduleHandler, $this->themeManager, $this->languageManager, $this->cache, $this->themeHandler); } /**