diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php index 6ea873af2b5eaa6ee45c812937581b7a33f0948c..2dd0e05e485c3aca220c274ccf6926b28e54c758 100644 --- a/core/lib/Drupal/Core/Extension/ThemeHandler.php +++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php @@ -67,11 +67,18 @@ public function getDefault() { public function listInfo() { if (!isset($this->list)) { $this->list = []; - $installed_themes = $this->configFactory->get('core.extension')->get('theme'); + $installed_themes = array_keys($this->configFactory->get('core.extension')->get('theme')); if (!empty($installed_themes)) { $list = $this->themeList->getList(); - foreach (array_keys($installed_themes) as $theme_name) { - $this->addTheme($list[$theme_name]); + foreach ($installed_themes as $theme) { + // Do not add installed themes that cannot be found by the + // extension.list.theme service. If a theme does go missing from the + // file system any call to ::getTheme() will result in an exception + // and an error being logged. Ignoring the problem here allows the + // theme system to fix itself while updating. + if (isset($list[$theme])) { + $this->addTheme($list[$theme]); + } } } } diff --git a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php index 576815f249bdd07b3ae8926629aa26fc342a3341..c0ead44e1cd43bf9a5aada90844ee4e83a8abdf4 100644 --- a/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php +++ b/core/tests/Drupal/Tests/Core/Extension/ThemeHandlerTest.php @@ -46,7 +46,7 @@ protected function setUp(): void { $this->configFactory = $this->getConfigFactoryStub([ 'core.extension' => [ 'module' => [], - 'theme' => [], + 'theme' => ['stark' => 'stark'], 'disabled' => [ 'theme' => [], ], @@ -108,6 +108,16 @@ public function testThemeLibrariesEmpty(): void { } } + /** + * Test that a missing theme doesn't break ThemeHandler::listInfo(). + * + * @covers ::listInfo + */ + public function testMissingTheme(): void { + $themes = $this->themeHandler->listInfo(); + $this->assertSame([], $themes); + } + } /**