diff -u b/core/includes/theme.inc b/core/includes/theme.inc --- b/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1203,7 +1203,19 @@ $render_element_type = isset($info['render element']) ? $info['render element'] : NULL; $themeManager = \Drupal::service('theme.manager'); - $variables += $themeManager->getDefaultTemplateVariables($render_element_type, $variables); + $variables += $themeManager->getDefaultTemplateVariables($render_element_type); + + // Merge element #attributes into $default_variables['attributes'] if they + // exist in render_element. + // This code is dublicated in ThemeManager::render(). Moving it to + // ThemeManager would make the ThemeManagerInterface messy. + if (isset($variables['#attributes'])) { + $variables['attributes'] = NestedArray::mergeDeep( + $variables['attributes'], + $variables['#attributes'] + ); + } + } /** diff -u b/core/lib/Drupal/Core/Theme/ThemeManager.php b/core/lib/Drupal/Core/Theme/ThemeManager.php --- b/core/lib/Drupal/Core/Theme/ThemeManager.php +++ b/core/lib/Drupal/Core/Theme/ThemeManager.php @@ -285,13 +285,14 @@ // Set default variables before preprocess hooks. $variables += $this->getDefaultTemplateVariables(); + $render_element_type = isset($info['render element']) ? $info['render element'] : NULL; // Merge element #attributes into $default_variables['attributes'] if they // exist in render_element. - if (isset($element['#attributes'])) { + if (isset($variables[$render_element_type]['#attributes'])) { $variables['attributes'] = NestedArray::mergeDeep( $variables['attributes'], - $element['#attributes'] + $variables[$render_element_type]['#attributes'] ); }