@@ -476,31 +476,29 @@ pub fn compute_text_alternative(root: &Element, options: ComputeTextAlternativeO
476476 if let Some ( name_from_alt) = use_attribute ( consulted_nodes, element, "alt" ) {
477477 return Some ( name_from_alt) ;
478478 }
479- } else if element. is_instance_of :: < HtmlOptGroupElement > ( ) {
480- if let Some ( name_from_label) = use_attribute ( consulted_nodes, element, "label" ) {
481- return Some ( name_from_label ) ;
482- }
479+ } else if element. is_instance_of :: < HtmlOptGroupElement > ( )
480+ && let Some ( name_from_label) = use_attribute ( consulted_nodes, element, "label" )
481+ {
482+ return Some ( name_from_label ) ;
483483 }
484484
485- if let Some ( input_element) = element. dyn_ref :: < HtmlInputElement > ( ) {
486- if input_element. type_ ( ) == "button"
485+ if let Some ( input_element) = element. dyn_ref :: < HtmlInputElement > ( )
486+ && ( input_element. type_ ( ) == "button"
487487 || input_element. type_ ( ) == "submit"
488- || input_element. type_ ( ) == "reset"
489- {
490- // https://w3c.github.io/html-aam/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-email-input-type-url-and-textarea-element-accessible-description-computation
491- if let Some ( name_from_value) = use_attribute ( consulted_nodes, element, "value" )
492- {
493- return Some ( name_from_value) ;
494- }
488+ || input_element. type_ ( ) == "reset" )
489+ {
490+ // https://w3c.github.io/html-aam/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-email-input-type-url-and-textarea-element-accessible-description-computation
491+ if let Some ( name_from_value) = use_attribute ( consulted_nodes, element, "value" ) {
492+ return Some ( name_from_value) ;
493+ }
495494
496- // TODO: l10n
497- if input_element. type_ ( ) == "submit" {
498- return Some ( "Submit" . into ( ) ) ;
499- }
500- // TODO: l10n
501- if input_element. type_ ( ) == "reset" {
502- return Some ( "Reset" . into ( ) ) ;
503- }
495+ // TODO: l10n
496+ if input_element. type_ ( ) == "submit" {
497+ return Some ( "Submit" . into ( ) ) ;
498+ }
499+ // TODO: l10n
500+ if input_element. type_ ( ) == "reset" {
501+ return Some ( "Reset" . into ( ) ) ;
504502 }
505503 }
506504
@@ -535,21 +533,21 @@ pub fn compute_text_alternative(root: &Element, options: ComputeTextAlternativeO
535533 // https://w3c.github.io/html-aam/#input-type-image-accessible-name-computation
536534 // TODO: WPT test consider label elements but html-aam does not mention them.
537535 // We follow existing implementations over spec.
538- if let Some ( input_element) = node. dyn_ref :: < HtmlInputElement > ( ) {
539- if input_element. type_ ( ) == "image" {
540- let name_for_alt = use_attribute ( consulted_nodes, input_element, "alt" ) ;
541- if let Some ( name_for_alt) = name_for_alt {
542- return Some ( name_for_alt) ;
543- }
544-
545- let name_for_title = use_attribute ( consulted_nodes, input_element, "title" ) ;
546- if let Some ( name_for_alt) = name_for_title {
547- return Some ( name_for_alt) ;
548- }
536+ if let Some ( input_element) = node. dyn_ref :: < HtmlInputElement > ( )
537+ && input_element. type_ ( ) == "image"
538+ {
539+ let name_for_alt = use_attribute ( consulted_nodes, input_element, "alt" ) ;
540+ if let Some ( name_for_alt) = name_for_alt {
541+ return Some ( name_for_alt) ;
542+ }
549543
550- // TODO: l10n
551- return Some ( "Submit Query" . into ( ) ) ;
544+ let name_for_title = use_attribute ( consulted_nodes, input_element, "title" ) ;
545+ if let Some ( name_for_alt) = name_for_title {
546+ return Some ( name_for_alt) ;
552547 }
548+
549+ // TODO: l10n
550+ return Some ( "Submit Query" . into ( ) ) ;
553551 }
554552
555553 if has_any_concrete_roles ( node, vec ! [ "button" ] ) {
@@ -595,42 +593,41 @@ pub fn compute_text_alternative(root: &Element, options: ComputeTextAlternativeO
595593 }
596594
597595 // 2B
598- if let Some ( current) = current. dyn_ref :: < Element > ( ) {
599- if let Some ( label_attribute_node) = current. get_attribute_node ( "aria-labelledby" ) {
600- // TODO: Do we generally need to block query IdRefs of attributes we have already consulted?
601- let label_elements = if !consulted_nodes. contains ( & label_attribute_node) {
602- query_id_refs ( current, "aria-labelledby" )
603- } else {
604- vec ! [ ]
605- } ;
606-
607- if compute == Compute :: Name && !context. is_referenced && !label_elements. is_empty ( )
608- {
609- consulted_nodes. push ( label_attribute_node. unchecked_into :: < Node > ( ) ) ;
610-
611- return label_elements
612- . into_iter ( )
613- . map ( move |element| {
614- // TODO: Chrome will consider repeated values i.e. use a node multiple times while we'll bail out in computeTextAlternative.
615- inner_compute_text_alternative (
616- compute,
617- hidden,
618- uncached_get_computed_style. clone ( ) ,
619- get_computed_style. clone ( ) ,
620- consulted_nodes,
621- & element,
622- ComputeTextAlternativeContext {
623- is_embedded_in_label : context. is_embedded_in_label ,
624- is_referenced : true ,
625- // This isn't recursion as specified, otherwise we would skip `aria-label` in
626- // <input id="myself" aria-label="foo" aria-labelledby="myself" />
627- recursion : false ,
628- } ,
629- )
630- } )
631- . collect :: < Vec < _ > > ( )
632- . join ( " " ) ;
633- }
596+ if let Some ( current) = current. dyn_ref :: < Element > ( )
597+ && let Some ( label_attribute_node) = current. get_attribute_node ( "aria-labelledby" )
598+ {
599+ // TODO: Do we generally need to block query IdRefs of attributes we have already consulted?
600+ let label_elements = if !consulted_nodes. contains ( & label_attribute_node) {
601+ query_id_refs ( current, "aria-labelledby" )
602+ } else {
603+ vec ! [ ]
604+ } ;
605+
606+ if compute == Compute :: Name && !context. is_referenced && !label_elements. is_empty ( ) {
607+ consulted_nodes. push ( label_attribute_node. unchecked_into :: < Node > ( ) ) ;
608+
609+ return label_elements
610+ . into_iter ( )
611+ . map ( move |element| {
612+ // TODO: Chrome will consider repeated values i.e. use a node multiple times while we'll bail out in computeTextAlternative.
613+ inner_compute_text_alternative (
614+ compute,
615+ hidden,
616+ uncached_get_computed_style. clone ( ) ,
617+ get_computed_style. clone ( ) ,
618+ consulted_nodes,
619+ & element,
620+ ComputeTextAlternativeContext {
621+ is_embedded_in_label : context. is_embedded_in_label ,
622+ is_referenced : true ,
623+ // This isn't recursion as specified, otherwise we would skip `aria-label` in
624+ // <input id="myself" aria-label="foo" aria-labelledby="myself" />
625+ recursion : false ,
626+ } ,
627+ )
628+ } )
629+ . collect :: < Vec < _ > > ( )
630+ . join ( " " ) ;
634631 }
635632 }
636633
@@ -651,18 +648,18 @@ pub fn compute_text_alternative(root: &Element, options: ComputeTextAlternativeO
651648 }
652649
653650 // 2D
654- if !is_marked_presentational ( current) {
655- if let Some ( element_text_alternative) = compute_element_text_alternative (
651+ if !is_marked_presentational ( current)
652+ && let Some ( element_text_alternative) = compute_element_text_alternative (
656653 compute,
657654 hidden,
658655 uncached_get_computed_style. clone ( ) ,
659656 get_computed_style. clone ( ) ,
660657 consulted_nodes,
661658 current,
662- ) {
663- consulted_nodes . push ( current . clone ( ) ) ;
664- return element_text_alternative ;
665- }
659+ )
660+ {
661+ consulted_nodes . push ( current . clone ( ) ) ;
662+ return element_text_alternative ;
666663 }
667664 }
668665
0 commit comments