Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
16.67% |
1 / 6 |
CRAP | |
8.33% |
3 / 36 |
| LibraryDiscoveryCollector | |
0.00% |
0 / 1 |
|
16.67% |
1 / 6 |
188.31 | |
8.33% |
3 / 36 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getCid | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
| resolveCacheMiss | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| getLibraryDefinitions | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 12 |
|||
| applyLibrariesExtend | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 11 |
|||
| reset | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Asset\LibraryDiscoveryCollector. | |
| */ | |
| namespace Drupal\Core\Asset; | |
| use Drupal\Component\Utility\NestedArray; | |
| use Drupal\Core\Asset\Exception\InvalidLibrariesExtendSpecificationException; | |
| use Drupal\Core\Asset\Exception\InvalidLibrariesOverrideSpecificationException; | |
| use Drupal\Core\Cache\CacheCollector; | |
| use Drupal\Core\Cache\CacheBackendInterface; | |
| use Drupal\Core\Lock\LockBackendInterface; | |
| use Drupal\Core\Theme\ThemeManagerInterface; | |
| /** | |
| * A CacheCollector implementation for building library extension info. | |
| */ | |
| class LibraryDiscoveryCollector extends CacheCollector { | |
| /** | |
| * The cache backend. | |
| * | |
| * @var \Drupal\Core\Cache\CacheBackendInterface | |
| */ | |
| protected $cache; | |
| /** | |
| * The lock backend. | |
| * | |
| * @var \Drupal\Core\Lock\LockBackendInterface | |
| */ | |
| protected $lock; | |
| /** | |
| * The library discovery parser. | |
| * | |
| * @var \Drupal\Core\Asset\LibraryDiscoveryParser | |
| */ | |
| protected $discoveryParser; | |
| /** | |
| * The theme manager. | |
| * | |
| * @var \Drupal\Core\Theme\ThemeManagerInterface | |
| */ | |
| protected $themeManager; | |
| /** | |
| * Constructs a CacheCollector object. | |
| * | |
| * @param \Drupal\Core\Cache\CacheBackendInterface $cache | |
| * The cache backend. | |
| * @param \Drupal\Core\Lock\LockBackendInterface $lock | |
| * The lock backend. | |
| * @param \Drupal\Core\Asset\LibraryDiscoveryParser $discovery_parser | |
| * The library discovery parser. | |
| * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager | |
| * The theme manager. | |
| */ | |
| public function __construct(CacheBackendInterface $cache, LockBackendInterface $lock, LibraryDiscoveryParser $discovery_parser, ThemeManagerInterface $theme_manager) { | |
| $this->themeManager = $theme_manager; | |
| parent::__construct(NULL, $cache, $lock, ['library_info']); | |
| $this->discoveryParser = $discovery_parser; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function getCid() { | |
| if (!isset($this->cid)) { | |
| $this->cid = 'library_info:' . $this->themeManager->getActiveTheme()->getName(); | |
| } | |
| return $this->cid; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function resolveCacheMiss($key) { | |
| $this->storage[$key] = $this->getLibraryDefinitions($key); | |
| $this->persist($key); | |
| return $this->storage[$key]; | |
| } | |
| /** | |
| * Returns the library definitions for a given extension. | |
| * | |
| * This also implements libraries-overrides for entire libraries that have | |
| * been specified by the LibraryDiscoveryParser. | |
| * | |
| * @param string $extension | |
| * The name of the extension for which library definitions will be returned. | |
| * | |
| * @return array | |
| * The library definitions for $extension with overrides applied. | |
| * | |
| * @throws \Drupal\Core\Asset\Exception\InvalidLibrariesOverrideSpecificationException | |
| */ | |
| protected function getLibraryDefinitions($extension) { | |
| $libraries = $this->discoveryParser->buildByExtension($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->get($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'])); | |
| } | |
| } | |
| } | |
| else { | |
| // If libraries are not overridden, then apply libraries-extend. | |
| $libraries[$name] = $this->applyLibrariesExtend($extension, $name, $definition); | |
| } | |
| } | |
| return $libraries; | |
| } | |
| /** | |
| * Applies the libraries-extend specified by the active theme. | |
| * | |
| * This extends the library definitions with the those specified by the | |
| * libraries-extend specifications for the active theme. | |
| * | |
| * @param string $extension | |
| * The name of the extension for which library definitions will be extended. | |
| * @param string $library_name | |
| * The name of the library whose definitions is to be extended. | |
| * @param $library_definition | |
| * The library definition to be extended. | |
| * | |
| * @return array | |
| * The library definition extended as specified by libraries-extend. | |
| * | |
| * @throws \Drupal\Core\Asset\Exception\InvalidLibrariesExtendSpecificationException | |
| */ | |
| protected function applyLibrariesExtend($extension, $library_name, $library_definition) { | |
| $libraries_extend = $this->themeManager->getActiveTheme()->getLibrariesExtend(); | |
| if (!empty($libraries_extend["$extension/$library_name"])) { | |
| foreach ($libraries_extend["$extension/$library_name"] as $library_extend_name) { | |
| if (!is_string($library_extend_name)) { | |
| // Only string library names are allowed. | |
| throw new InvalidLibrariesExtendSpecificationException('The libraries-extend specification for each library must be a list of strings.'); | |
| } | |
| list($new_extension, $new_library_name) = explode('/', $library_extend_name, 2); | |
| $new_libraries = $this->get($new_extension); | |
| if (isset($new_libraries[$new_library_name])) { | |
| $library_definition = NestedArray::mergeDeep($library_definition, $new_libraries[$new_library_name]); | |
| } | |
| else { | |
| throw new InvalidLibrariesExtendSpecificationException(sprintf('The specified library "%s" does not exist.', $library_extend_name)); | |
| } | |
| } | |
| } | |
| return $library_definition; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function reset() { | |
| parent::reset(); | |
| $this->cid = NULL; | |
| } | |
| } |