diff --git a/core/includes/module.inc b/core/includes/module.inc index 6b03302..a37c654 100644 --- a/core/includes/module.inc +++ b/core/includes/module.inc @@ -23,9 +23,7 @@ * @see \Drupal\Core\Extension\ThemeHandler::listInfo() */ function system_list($type) { - return array_filter(\Drupal::service('extension.list.' . $type)->getList(), function (Extension $extension) { - return $extension->status; - }); + return \Drupal::service('extension.list.' . $type)->getInstalled(); } /** diff --git a/core/lib/Drupal/Core/Extension/ExtensionList.php b/core/lib/Drupal/Core/Extension/ExtensionList.php index 218c9bf..5606404 100644 --- a/core/lib/Drupal/Core/Extension/ExtensionList.php +++ b/core/lib/Drupal/Core/Extension/ExtensionList.php @@ -263,6 +263,26 @@ public function get($extension_name) { } /** + * Returns a list of installed extensions. + * + * @return \Drupal\Core\Extension\Extension[] + * A list of installed extension objects, keyed by machine name. + */ + public function getInstalled() { + return array_intersect_key($this->getList(), array_flip($this->getInstalledExtensionNames())); + } + + /** + * Returns a list of uninstalled extensions. + * + * @return \Drupal\Core\Extension\Extension[] + * A list of uninstalled extension objects, keyed by machine name. + */ + public function getUninstalled() { + return array_diff_key($this->getList(), array_flip($this->getInstalledExtensionNames())); + } + + /** * Returns all available extensions. * * @return \Drupal\Core\Extension\Extension[] diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php index a608b86..7230163 100644 --- a/core/lib/Drupal/Core/Extension/ThemeHandler.php +++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php @@ -164,12 +164,7 @@ public function uninstall(array $theme_list) { public function listInfo() { if (!isset($this->list)) { $this->list = []; - $themes = $this->getThemeExtensionList()->getList(); - foreach ($themes as $theme) { - if ($theme->status) { - $this->addTheme($theme); - } - } + array_map([$this, 'addTheme'], $this->getThemeExtensionList()->getInstalled()); } return $this->list; } diff --git a/core/tests/Drupal/Tests/Core/Extension/ExtensionListTest.php b/core/tests/Drupal/Tests/Core/Extension/ExtensionListTest.php index 80a0c76..33d634a 100644 --- a/core/tests/Drupal/Tests/Core/Extension/ExtensionListTest.php +++ b/core/tests/Drupal/Tests/Core/Extension/ExtensionListTest.php @@ -206,6 +206,36 @@ public function testReset() { } /** + * @covers ::getInstalled + * @covers ::getUninstalled + */ + public function testInstalledUninstalled() { + $test_extension_list = $this->setupTestExtensionList(['test_name_1', 'test_name_2', 'test_name_3']); + $all = $test_extension_list->getList(); + $installed = $test_extension_list->getInstalled(); + $uninstalled = $test_extension_list->getUninstalled(); + + $this->assertCount(3, $all); + $this->assertCount(0, $installed); + $this->assertCount(3, $uninstalled); + $this->assertEquals(['test_name_1', 'test_name_2', 'test_name_3'], array_keys($all)); + $this->assertEquals(['test_name_1', 'test_name_2', 'test_name_3'], array_keys($uninstalled)); + + $test_extension_list->setInstalledExtensions(['test_name_1', 'test_name_2']); + $test_extension_list->reset(); + $all = $test_extension_list->getList(); + $installed = $test_extension_list->getInstalled(); + $uninstalled = $test_extension_list->getUninstalled(); + + $this->assertCount(3, $all); + $this->assertCount(2, $installed); + $this->assertCount(1, $uninstalled); + $this->assertEquals(['test_name_1', 'test_name_2', 'test_name_3'], array_keys($all)); + $this->assertEquals(['test_name_1', 'test_name_2'], array_keys($installed)); + $this->assertEquals(['test_name_3'], array_keys($uninstalled)); + } + + /** * @return \Drupal\Tests\Core\Extension\TestExtension */ protected function setupTestExtensionList($extension_names = ['test_name']) {