diff --git a/php-transformer/src/HtmlToBlocks/HtmlTransformer.php b/php-transformer/src/HtmlToBlocks/HtmlTransformer.php
index 21fa6be..9bd51db 100644
--- a/php-transformer/src/HtmlToBlocks/HtmlTransformer.php
+++ b/php-transformer/src/HtmlToBlocks/HtmlTransformer.php
@@ -1012,12 +1012,12 @@ private function interactionCandidatesForElement(DOMElement $element): array
$candidates[] = $this->interactionCandidate($element, 'modal', $this->modalTriggerHint($element), $this->targetForElement($element), array_filter(array('modal_like', 'dialog' === $tagName ? 'dialog_element' : '', '' !== $role ? 'role:' . $role : '')), 'medium', 'modal_runtime');
}
- if ( 'tablist' === $role || 'tab' === $role ) {
- $candidates[] = $this->interactionCandidate($element, 'tabs', 'tab' === $role ? 'tab_select' : 'tablist', $this->controlledTarget($element), array_filter(array('role:' . $role, '' !== $this->attr($element, 'aria-controls') ? 'aria-controls' : '')), 'high', 'tab_state');
+ if ( in_array($role, array('tablist', 'tab', 'tabpanel'), true) ) {
+ $candidates[] = $this->interactionCandidate($element, 'tabs', 'tab' === $role ? 'tab_select' : $role, $this->controlledTarget($element), array_filter(array('role:' . $role, '' !== $this->attr($element, 'aria-controls') ? 'aria-controls' : '')), 'high', 'tab_state');
}
- if ( ( in_array($tagName, array('button', 'a'), true) || '' !== $role ) && preg_match('/(?:^|[\s_-])accordion(?:$|[\s_-])/', $nameText) ) {
- $candidates[] = $this->interactionCandidate($element, 'accordion', $this->controlTrigger($element, $events), $this->controlledTarget($element), array_filter(array('accordion_like', '' !== $this->attr($element, 'aria-expanded') ? 'aria-expanded' : '')), 'medium', 'accordion_state');
+ if ( ( in_array($tagName, array('button', 'a'), true) || '' !== $role ) && ( preg_match('/(?:^|[\s_-])accordion(?:$|[\s_-])/', $nameText) || ( $hasAriaControl && 'tab' !== $role && '' !== trim($this->attr($element, 'aria-expanded')) ) ) ) {
+ $candidates[] = $this->interactionCandidate($element, 'accordion', $this->controlTrigger($element, $events), $this->controlledTarget($element), array_filter(array('accordion_like', '' !== $this->attr($element, 'aria-expanded') ? 'aria-expanded' : '', '' !== $this->attr($element, 'aria-controls') ? 'aria-controls' : '')), 'medium', 'accordion_state');
}
if ( preg_match('/(?:^|[\s_-])(?:carousel|slider|slideshow|swiper)(?:$|[\s_-])/', $nameText) ) {
diff --git a/php-transformer/tests/fixtures/parity/html-interaction-candidates-report.json b/php-transformer/tests/fixtures/parity/html-interaction-candidates-report.json
index 8e9b76e..b9eeca5 100644
--- a/php-transformer/tests/fixtures/parity/html-interaction-candidates-report.json
+++ b/php-transformer/tests/fixtures/parity/html-interaction-candidates-report.json
@@ -13,28 +13,35 @@
},
"operation": "html_transformer.transform",
"input": {
- "content": "FAQ
Answer.
Tab one
Open signup"
+ "content": "FAQ
Answer.
Shipping details.
Promo modal
"
},
"expect": [
{ "path": "status", "assert": "equals", "value": "success" },
- { "path": "source_reports.interaction_candidates", "assert": "count", "count": 11 },
+ { "path": "source_reports.interaction_candidates", "assert": "count", "count": 17 },
{ "path": "source_reports.interaction_candidates.0.kind", "assert": "equals", "value": "details" },
{ "path": "source_reports.interaction_candidates.0.target", "assert": "equals", "value": "#faq" },
{ "path": "source_reports.interaction_candidates.1.kind", "assert": "equals", "value": "form" },
{ "path": "source_reports.interaction_candidates.1.trigger", "assert": "equals", "value": "submit" },
{ "path": "source_reports.interaction_candidates.1.target", "assert": "equals", "value": "/contact" },
{ "path": "source_reports.interaction_candidates.2.kind", "assert": "equals", "value": "control" },
- { "path": "source_reports.interaction_candidates.2.target", "assert": "equals", "value": "#panel" },
+ { "path": "source_reports.interaction_candidates.2.target", "assert": "equals", "value": "#faq-panel" },
{ "path": "source_reports.interaction_candidates.3.kind", "assert": "equals", "value": "accordion" },
{ "path": "source_reports.interaction_candidates.4.kind", "assert": "equals", "value": "tabs" },
{ "path": "source_reports.interaction_candidates.5.kind", "assert": "equals", "value": "control" },
- { "path": "source_reports.interaction_candidates.5.target", "assert": "equals", "value": "#tab-one" },
+ { "path": "source_reports.interaction_candidates.5.target", "assert": "equals", "value": "#panel-one" },
{ "path": "source_reports.interaction_candidates.6.kind", "assert": "equals", "value": "tabs" },
- { "path": "source_reports.interaction_candidates.7.kind", "assert": "equals", "value": "modal" },
- { "path": "source_reports.interaction_candidates.8.kind", "assert": "equals", "value": "carousel" },
- { "path": "source_reports.interaction_candidates.9.kind", "assert": "equals", "value": "carousel" },
- { "path": "source_reports.interaction_candidates.10.kind", "assert": "equals", "value": "control" },
- { "path": "source_reports.conversion_report.interaction_candidates", "assert": "count", "count": 11 },
- { "path": "source_reports.conversion_report.interaction_candidates.10.evidence.0", "assert": "equals", "value": "onclick" }
+ { "path": "source_reports.interaction_candidates.7.kind", "assert": "equals", "value": "tabs" },
+ { "path": "source_reports.interaction_candidates.7.trigger", "assert": "equals", "value": "tabpanel" },
+ { "path": "source_reports.interaction_candidates.8.kind", "assert": "equals", "value": "modal" },
+ { "path": "source_reports.interaction_candidates.9.kind", "assert": "equals", "value": "modal" },
+ { "path": "source_reports.interaction_candidates.10.kind", "assert": "equals", "value": "carousel" },
+ { "path": "source_reports.interaction_candidates.11.kind", "assert": "equals", "value": "carousel" },
+ { "path": "source_reports.interaction_candidates.12.kind", "assert": "equals", "value": "carousel" },
+ { "path": "source_reports.interaction_candidates.13.kind", "assert": "equals", "value": "carousel" },
+ { "path": "source_reports.interaction_candidates.14.kind", "assert": "equals", "value": "control" },
+ { "path": "source_reports.interaction_candidates.15.kind", "assert": "equals", "value": "carousel" },
+ { "path": "source_reports.interaction_candidates.16.kind", "assert": "equals", "value": "control" },
+ { "path": "source_reports.conversion_report.interaction_candidates", "assert": "count", "count": 17 },
+ { "path": "source_reports.conversion_report.interaction_candidates.16.evidence.0", "assert": "equals", "value": "data-action" }
]
}