diff --git a/core/lib/Drupal/Core/Asset/LibraryDiscovery.php b/core/lib/Drupal/Core/Asset/LibraryDiscovery.php index 873939c..cb7d9e7 100644 --- a/core/lib/Drupal/Core/Asset/LibraryDiscovery.php +++ b/core/lib/Drupal/Core/Asset/LibraryDiscovery.php @@ -84,7 +84,7 @@ public function getLibraryByName($extension, $name) { if (isset($extension[$name]['override'])) { $override = $extension[$name]['override']; if ($override === FALSE) { - // Remove the library definition if false is given. + // Remove the library definition if FALSE is given. unset($extension[$name]); return FALSE; } diff --git a/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php b/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php index f6de366..89257cd 100644 --- a/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php +++ b/core/lib/Drupal/Core/Asset/LibraryDiscoveryParser.php @@ -336,32 +336,33 @@ protected function parseLibraryInfo($extension, $path) { protected function applyLibrariesOverride($libraries, $extension) { $active_theme = $this->themeManager->getActiveTheme(); $libraries_overrides = $active_theme->getLibrariesOverride(); - foreach ($libraries as $name => $library) { + foreach ($libraries as $library_name => $library) { // Process libraries overrides. - foreach ($libraries_overrides as $asset => $override) { + $namespaced_library_name = "$extension/$library_name"; + foreach ($libraries_overrides as $definition => $override) { // Active theme defines an override for this library. - if ($asset === "$extension/$name") { + if ($this->isEntireLibrary($definition, $namespaced_library_name)) { // The active theme defines an override for the whole library. Use the // override key to specify that this library will be overridden when // it is called. // @see \Drupal\Core\Asset\LibraryDiscovery::getLibraryByName() if ($override) { - $libraries[$name]['override'] = $override; + $libraries[$library_name]['override'] = $override; } else { - $libraries[$name]['override'] = FALSE; + $libraries[$library_name]['override'] = FALSE; } } - elseif (strpos($asset, "$extension/$name/") !== FALSE) { + elseif ($this->isPartOfLibrary($definition, $namespaced_library_name)) { // Active theme defines an override for an asset within this library. // Throw an exception if the asset is not properly specified. - if (substr_count($asset, '/') < 3) { - throw new InvalidLibrariesOverrideSpecificationException(sprintf('Library asset %s is not correctly specified. It should be in the form "extension/library_name/sub_key/path/to/asset.js".', $asset)); + if (substr_count($definition, '/') < 3) { + throw new InvalidLibrariesOverrideSpecificationException(sprintf('Library asset %s is not correctly specified. It should be in the form "extension/library_name/sub_key/path/to/asset.js".', $definition)); } - list(, , $sub_key, $value) = explode('/', $asset, 4); + list(, , $sub_key, $value) = explode('/', $definition, 4); if ($sub_key === 'drupalSettings') { // drupalSettings may not be overridden. - throw new InvalidLibrariesOverrideSpecificationException(sprintf('drupalSettings may not be overridden in libraries-override. Trying to override %s. Use hook_library_info_alter() instead.', $asset)); + throw new InvalidLibrariesOverrideSpecificationException(sprintf('drupalSettings may not be overridden in libraries-override. Trying to override %s. Use hook_library_info_alter() instead.', $definition)); } elseif ($sub_key === 'css') { // SMACSS category should be incorporated into the asset name. @@ -376,13 +377,13 @@ protected function applyLibrariesOverride($libraries, $extension) { // Get the attributes of the asset to be overridden. If the key does // not exist, then throw an exception. $key_exists = NULL; - $attributes = NestedArray::getValue($libraries[$name], $parents, $key_exists); + $attributes = NestedArray::getValue($libraries[$library_name], $parents, $key_exists); if ($key_exists) { // Remove asset to be overridden, but keep its attributes. - NestedArray::unsetValue($libraries[$name], $parents); + NestedArray::unsetValue($libraries[$library_name], $parents); if ($override) { // Replace with an override if specified. - NestedArray::setValue($libraries[$name], $new_parents, $attributes); + NestedArray::setValue($libraries[$library_name], $new_parents, $attributes); } } } @@ -413,4 +414,32 @@ protected function isValidUri($string) { return count(explode('://', $string)) === 2; } + /** + * Checks if the specified definition asset is a full library . + * + * @param string $definition + * The asset definition being checked. + * @param string $library_name + * The name of the library. + * @return bool + * Returns true if $definition is a full library specified by $library_name. + */ + protected function isEntireLibrary($definition, $library_name) { + return $definition === $library_name; + } + + /** + * Determines if the specified asset definition is a part of a library. + * + * @param string $definition + * The asset definition being checked. + * @param string $library_name + * The name of the library. + * @return bool + * Returns true if the definition is part of the library, false otherwise. + */ + protected function isPartOfLibrary($definition, $library_name) { + return strpos($definition, "$library_name/") === 0; + } + } diff --git a/core/lib/Drupal/Core/Theme/ActiveTheme.php b/core/lib/Drupal/Core/Theme/ActiveTheme.php index 6950c76..603dc94 100644 --- a/core/lib/Drupal/Core/Theme/ActiveTheme.php +++ b/core/lib/Drupal/Core/Theme/ActiveTheme.php @@ -224,7 +224,7 @@ public function getRegions() { * @endcode * * @return array - * The list of libraries-override. + * The list of libraries overrides. */ public function getLibrariesOverride() { return $this->librariesOverride; diff --git a/core/lib/Drupal/Core/Theme/ThemeInitialization.php b/core/lib/Drupal/Core/Theme/ThemeInitialization.php index 0d0af89..8a240d5 100644 --- a/core/lib/Drupal/Core/Theme/ThemeInitialization.php +++ b/core/lib/Drupal/Core/Theme/ThemeInitialization.php @@ -164,12 +164,12 @@ public function getActiveTheme(Extension $theme, array $base_themes = []) { // @todo Remove in Drupal 9.0.x. $values['stylesheets_remove'] = $this->prepareStylesheetsRemove($theme, $base_themes); - // Prepare libraries overrides from this theme and ancestor themes. - // This allows child themes to easily remove CSS files from base themes and + // Prepare libraries overrides from this theme and ancestor themes. This + // allows child themes to easily remove CSS files from base themes and // modules. $values['libraries_override'] = []; - // Get libraries-override declared by base theme. + // Get libraries overrides declared by base themes. foreach ($base_themes as $base) { if (!empty($base->info['libraries-override'])) { foreach ($base->info['libraries-override'] as $library => $override) { @@ -178,7 +178,7 @@ public function getActiveTheme(Extension $theme, array $base_themes = []) { } } - // Add libraries-override declared by this theme. + // Add libraries overrides declared by this theme. if (!empty($theme->info['libraries-override'])) { foreach ($theme->info['libraries-override'] as $library => $override) { $values['libraries_override'][$library] = $override ? $this->resolveThemeAssetPath($theme, $library, $override) : $override; diff --git a/core/modules/system/tests/themes/test_theme/test_theme.info.yml b/core/modules/system/tests/themes/test_theme/test_theme.info.yml index 40a52a9..9e12ea1 100644 --- a/core/modules/system/tests/themes/test_theme/test_theme.info.yml +++ b/core/modules/system/tests/themes/test_theme/test_theme.info.yml @@ -31,9 +31,9 @@ libraries-override: core/jquery/js/assets/vendor/jquery/jquery.min.js: js/collapse.js # Use Drupal relative paths. core/drupal.dropbutton/css/component/misc/dropbutton/dropbutton.css: /themes/my_theme/css/dropbutton.css - # Use streamwrappers. + # Use stream wrappers. core/drupal.vertical-tabs/css/component/misc/vertical-tabs.css: public://my_css/vertical-tabs.css - # Use protocol-free URI. + # Use protocol-relative URI. core/jquery.ui/css/component/assets/vendor/jquery.ui/themes/base/core.css: //my-server/my_theme/css/jquery_ui.css # Use regular URI. core/jquery.farbtastic/css/component/assets/vendor/farbtastic/farbtastic.css: http://example.com/my_theme/css/farbtastic.css