Loading includes/webform.theme.inc +6 −3 Original line number Diff line number Diff line Loading @@ -498,21 +498,24 @@ function webform_preprocess_fieldset(&$variables) { unset($variables['attributes']['required']); } // Add role="radiogroup" on fieldsets containing radiobuttons. // Add aria-required="true" only on fieldsets containing required // radiobuttons. // // Issue #3240249: Aria-required on fieldset trigger accessibility fails. // @see https://www.drupal.org/project/webform/issues/3240249 // @see https://www.drupal.org/project/webform/issues/3277192 /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */ $element_manager = \Drupal::service('plugin.manager.webform.element'); $element_plugin = $element_manager->getElementInstance($element); $is_radios = ($element_plugin instanceof WebformRadios || $element_plugin instanceof WebformEntityRadios); if ($is_radios) { $variables['attributes']['role'] = 'radiogroup'; $id = $variables['attributes']['id'] . '-legend'; $variables['legend']['attributes']['id'] = $id; $variables['attributes']['aria-labelledby'] = $id; if (isset($variables['attributes']['aria-required'])) { // The aria-required is _not_ necessary on a fieldset of radio elements. unset($variables['attributes']['aria-required']); } } elseif (isset($variables['attributes']['aria-required'])) { unset($variables['attributes']['aria-required']); Loading tests/src/Functional/Element/WebformElementCompositeTest.php +3 −3 Original line number Diff line number Diff line Loading @@ -119,10 +119,10 @@ webform_element_composite_advanced: $this->drupalGet('/webform/test_element_composite_wrapper'); // Check fieldset wrapper. $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset" id="edit-radios-wrapper-fieldset--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-visible-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" aria-required="true" role="radiogroup" aria-labelledby="edit-radios-wrapper-fieldset--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset" id="edit-radios-wrapper-fieldset--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-visible-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper">'); // Check fieldset wrapper with hidden title. $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset-hidden-title" id="edit-radios-wrapper-fieldset-hidden-title--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-hidden-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" aria-required="true" role="radiogroup" aria-labelledby="edit-radios-wrapper-fieldset-hidden-title--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset-hidden-title" id="edit-radios-wrapper-fieldset-hidden-title--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-hidden-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper">'); // Check form element wrapper. $assert_session->responseContains('<div class="js-form-item form-item js-form-type-radios form-item-radios-wrapper-form-element js-form-item-radios-wrapper-form-element">'); Loading @@ -140,7 +140,7 @@ webform_element_composite_advanced: } // Check wrapper with #states. $assert_session->responseContains('<fieldset data-drupal-selector="edit-states-fieldset" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-states-fieldset--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}" role="radiogroup" aria-labelledby="edit-states-fieldset--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-states-fieldset" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-states-fieldset--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); $assert_session->responseContains('<div class="js-webform-states-hidden js-form-item form-item js-form-type-radios form-item-states-form-item js-form-item-states-form-item" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); $assert_session->responseContains('<div data-drupal-selector="edit-states-container" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite js-form-wrapper form-wrapper" id="edit-states-container--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); Loading tests/src/Functional/States/WebformStatesHiddenTest.php +1 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ class WebformStatesHiddenTest extends WebformBrowserTestBase { $assert_session->responseContains('<div class="js-webform-states-hidden js-form-item form-item js-form-type-checkbox form-item-dependent-checkbox js-form-item-dependent-checkbox">'); // Radios. $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-radios" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-radios--wrapper" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}" role="radiogroup" aria-labelledby="edit-dependent-radios--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-radios" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-radios--wrapper" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}">'); // Select other. $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-select-other" class="js-webform-select-other webform-select-other js-webform-states-hidden js-form-item webform-select-other--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-webform-select-other webform-type-webform-select-other form-item js-form-wrapper form-wrapper" id="edit-dependent-select-other" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}">'); Loading Loading
includes/webform.theme.inc +6 −3 Original line number Diff line number Diff line Loading @@ -498,21 +498,24 @@ function webform_preprocess_fieldset(&$variables) { unset($variables['attributes']['required']); } // Add role="radiogroup" on fieldsets containing radiobuttons. // Add aria-required="true" only on fieldsets containing required // radiobuttons. // // Issue #3240249: Aria-required on fieldset trigger accessibility fails. // @see https://www.drupal.org/project/webform/issues/3240249 // @see https://www.drupal.org/project/webform/issues/3277192 /** @var \Drupal\webform\Plugin\WebformElementManagerInterface $element_manager */ $element_manager = \Drupal::service('plugin.manager.webform.element'); $element_plugin = $element_manager->getElementInstance($element); $is_radios = ($element_plugin instanceof WebformRadios || $element_plugin instanceof WebformEntityRadios); if ($is_radios) { $variables['attributes']['role'] = 'radiogroup'; $id = $variables['attributes']['id'] . '-legend'; $variables['legend']['attributes']['id'] = $id; $variables['attributes']['aria-labelledby'] = $id; if (isset($variables['attributes']['aria-required'])) { // The aria-required is _not_ necessary on a fieldset of radio elements. unset($variables['attributes']['aria-required']); } } elseif (isset($variables['attributes']['aria-required'])) { unset($variables['attributes']['aria-required']); Loading
tests/src/Functional/Element/WebformElementCompositeTest.php +3 −3 Original line number Diff line number Diff line Loading @@ -119,10 +119,10 @@ webform_element_composite_advanced: $this->drupalGet('/webform/test_element_composite_wrapper'); // Check fieldset wrapper. $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset" id="edit-radios-wrapper-fieldset--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-visible-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" aria-required="true" role="radiogroup" aria-labelledby="edit-radios-wrapper-fieldset--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset" id="edit-radios-wrapper-fieldset--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-visible-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper">'); // Check fieldset wrapper with hidden title. $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset-hidden-title" id="edit-radios-wrapper-fieldset-hidden-title--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-hidden-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" aria-required="true" role="radiogroup" aria-labelledby="edit-radios-wrapper-fieldset-hidden-title--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-radios-wrapper-fieldset-hidden-title" id="edit-radios-wrapper-fieldset-hidden-title--wrapper" class="radios--wrapper fieldgroup form-composite webform-composite-hidden-title required js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper">'); // Check form element wrapper. $assert_session->responseContains('<div class="js-form-item form-item js-form-type-radios form-item-radios-wrapper-form-element js-form-item-radios-wrapper-form-element">'); Loading @@ -140,7 +140,7 @@ webform_element_composite_advanced: } // Check wrapper with #states. $assert_session->responseContains('<fieldset data-drupal-selector="edit-states-fieldset" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-states-fieldset--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}" role="radiogroup" aria-labelledby="edit-states-fieldset--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-states-fieldset" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-states-fieldset--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); $assert_session->responseContains('<div class="js-webform-states-hidden js-form-item form-item js-form-type-radios form-item-states-form-item js-form-item-states-form-item" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); $assert_session->responseContains('<div data-drupal-selector="edit-states-container" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite js-form-wrapper form-wrapper" id="edit-states-container--wrapper" data-drupal-states="{"visible":{".webform-submission-test-element-composite-wrapper-add-form :input[name=\u0022states_checkbox\u0022]":{"checked":true}}}">'); Loading
tests/src/Functional/States/WebformStatesHiddenTest.php +1 −1 Original line number Diff line number Diff line Loading @@ -53,7 +53,7 @@ class WebformStatesHiddenTest extends WebformBrowserTestBase { $assert_session->responseContains('<div class="js-webform-states-hidden js-form-item form-item js-form-type-checkbox form-item-dependent-checkbox js-form-item-dependent-checkbox">'); // Radios. $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-radios" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-radios--wrapper" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}" role="radiogroup" aria-labelledby="edit-dependent-radios--wrapper-legend">'); $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-radios" class="js-webform-states-hidden radios--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-radios webform-type-radios js-form-item form-item js-form-wrapper form-wrapper" id="edit-dependent-radios--wrapper" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}">'); // Select other. $assert_session->responseContains('<fieldset data-drupal-selector="edit-dependent-select-other" class="js-webform-select-other webform-select-other js-webform-states-hidden js-form-item webform-select-other--wrapper fieldgroup form-composite webform-composite-visible-title js-webform-type-webform-select-other webform-type-webform-select-other form-item js-form-wrapper form-wrapper" id="edit-dependent-select-other" data-drupal-states="{"visible":{".webform-submission-test-states-server-hidden-add-form :input[name=\u0022trigger_checkbox\u0022]":{"checked":true}}}">'); Loading