diff -u b/core/lib/Drupal/Core/Theme/Registry.php b/core/lib/Drupal/Core/Theme/Registry.php --- b/core/lib/Drupal/Core/Theme/Registry.php +++ b/core/lib/Drupal/Core/Theme/Registry.php @@ -638,12 +638,18 @@ $base_hook = $hook; while (!isset($cache[$base_hook]) && $pos = strrpos($base_hook, '__')) { $base_hook = substr($base_hook, 0, $pos); - $cache[$hook]['base hook'] = $base_hook; - $cache[$hook]['preprocess functions'][] = $processor; // If the current hook is based on a pattern, get the base hook. if (isset($cache[$hook]['base hook'])) { $base_hook = $cache[$hook]['base hook']; } + // If base hook exists clone of it for the preprocess function + // without a template. + // @see https://www.drupal.org/node/2457295 + if (isset($cache[$base_hook])) { + $cache[$hook] = $cache[$base_hook]; + $cache[$hook]['base hook'] = $base_hook; + $cache[$hook]['preprocess functions'][] = $processor; + } } } } diff -u b/core/modules/system/src/Tests/Theme/ThemeTest.php b/core/modules/system/src/Tests/Theme/ThemeTest.php --- b/core/modules/system/src/Tests/Theme/ThemeTest.php +++ b/core/modules/system/src/Tests/Theme/ThemeTest.php @@ -310,8 +310,8 @@ 'Kitten', 'Flamingo', ]; - foreach ($items as $key => $item) { - $this->assertEqual((string) $item, $expected_values[$key]); + foreach ($expected_values as $key => $value) { + $this->assertEqual((string) $value, $items[$key]); } } }