diff --git a/core/lib/Drupal/Core/Asset/LibraryDiscovery.php b/core/lib/Drupal/Core/Asset/LibraryDiscovery.php index cb7d9e7..1732b86 100644 --- a/core/lib/Drupal/Core/Asset/LibraryDiscovery.php +++ b/core/lib/Drupal/Core/Asset/LibraryDiscovery.php @@ -61,51 +61,15 @@ public function __construct(CacheCollectorInterface $library_discovery_collector * {@inheritdoc} */ public function getLibrariesByExtension($extension) { - if (!isset($this->libraryDefinitions[$extension])) { - $libraries = $this->collector->get($extension); - $this->libraryDefinitions[$extension] = []; - foreach ($libraries as $name => $definition) { - $library_name = "$extension/$name"; - $this->libraryDefinitions[$extension][$name] = $definition; - } - } - - return $this->libraryDefinitions[$extension]; + return $this->getLibraryDefinitions($extension); } /** * {@inheritdoc} */ public function getLibraryByName($extension, $name) { - $extension = $this->getLibrariesByExtension($extension); - if (isset($extension[$name])) { - // Handle libraries that are marked for override or removal. - // @see \Drupal\Core\Asset\LibraryDiscoveryParser::applyLibrariesOverride() - if (isset($extension[$name]['override'])) { - $override = $extension[$name]['override']; - if ($override === FALSE) { - // Remove the library definition if FALSE is given. - unset($extension[$name]); - return FALSE; - } - else { - // Otherwise replace with existing library definition if it exists. - // Throw an exception if it doesn't. - list($new_extension, $new_name) = explode('/', $override); - if ($library = $this->getLibraryByName($new_extension, $new_name)) { - $extension[$name] = $library; - } - else { - throw new InvalidLibrariesOverrideSpecificationException(sprintf('The specified library %s does not exist.', $override)); - } - } - } - return $extension[$name]; - } - else { - return FALSE; - } - + $extension = $this->getLibraryDefinitions($extension); + return isset($extension[$name]) ? $extension[$name] : FALSE; } /** @@ -113,6 +77,39 @@ public function getLibraryByName($extension, $name) { */ public function clearCachedDefinitions() { $this->cacheTagInvalidator->invalidateTags(['library_info']); + $this->libraryDefinitions = []; + $this->collector->clear(); + } + + protected function getLibraryDefinitions($extension) { + if (!isset($this->libraryDefinitions[$extension])) { + $libraries = $this->collector->get($extension); + $this->libraryDefinitions[$extension] = []; + foreach ($libraries as $name => $definition) { + // Handle libraries that are marked for override or removal. + // @see \Drupal\Core\Asset\LibraryDiscoveryParser::applyLibrariesOverride() + if (isset($definition['override'])) { + if ($definition['override'] === FALSE) { + // Remove the library definition if FALSE is given. + unset($libraries[$name]); + } + else { + // Otherwise replace with existing library definition if it exists. + // Throw an exception if it doesn't. + list($replacement_extension, $replacement_name) = explode('/', $definition['override']); + $replacement_definition = $this->getLibraryDefinitions($replacement_extension); + if (isset($replacement_definition[$replacement_name])) { + $libraries[$name] = $replacement_definition[$replacement_name]; + } + else { + throw new InvalidLibrariesOverrideSpecificationException(sprintf('The specified library %s does not exist.', $definition['override'])); + } + } + } + } + $this->libraryDefinitions[$extension] = $libraries; + } + return $this->libraryDefinitions[$extension]; } } diff --git a/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php b/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php index 7791869..427640f 100644 --- a/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php +++ b/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php @@ -426,14 +426,16 @@ protected function setOverrideValue(array &$library, array $sub_key, array $over // not exist, then throw an exception. $key_exists = NULL; $parents = array_merge($sub_key, [$original]); - // Ensure the replacement path is relative to drupal root. - $replacement = $this->resolveThemeAssetPath($theme_path, $replacement); - $new_parents = array_merge($sub_key, [$replacement]); + // Save the attributes of the library asset to be overridden. $attributes = NestedArray::getValue($library, $parents, $key_exists); if ($key_exists) { - // Remove asset to be overridden, but keep its attributes. + // Remove asset to be overridden. NestedArray::unsetValue($library, $parents); + // No need to replace if FALSE is specified, since that is a removal. if ($replacement) { + // Ensure the replacement path is relative to drupal root. + $replacement = $this->resolveThemeAssetPath($theme_path, $replacement); + $new_parents = array_merge($sub_key, [$replacement]); // Replace with an override if specified. NestedArray::setValue($library, $new_parents, $attributes); } diff --git a/core/modules/system/tests/themes/test_theme/test_theme.libraries.yml b/core/modules/system/tests/themes/test_theme/test_theme.libraries.yml index d82f1d8..52bb147 100644 --- a/core/modules/system/tests/themes/test_theme/test_theme.libraries.yml +++ b/core/modules/system/tests/themes/test_theme/test_theme.libraries.yml @@ -3,10 +3,11 @@ global-styling: css: base: kitten.css: {} + collapse: + version: VERSION js: js/collapse.js: { } - css: base: css/collapse.css: { }