OSSCA Chromium

기여 목록 / 8313729

8313729: a11y: Update form role after name changes

BlinkfixMerged

role="form" 또는 <form> 요소의 접근성 이름(accessible name)이 런타임에 동적으로 변경될 때 캐시된 역할(cached role)을 업데이트

문제 설명

접근성 트리가 노드를 표현할 때, 이름 변경에 따른 역할 지연 업데이트(deferred role update) 대상에 role="form"과 <form> 요소가 누락되어 있었습니다.

  • ARIA 라벨(aria-label, aria-labelledby)이 동적으로 추가되거나 제거될 때 해당 요소의 캐시된 역할(cached role)이 즉시 갱신되지 않는 문제 발생
  • role="form" 요소를 처음 접근성 캐시에 로드할 때 이름이 없으면 generic 역할로 지정되었다가, 런타임에 aria-label이 추가되더라도 form 역할로 업데이트되지 않음
  • 동적 DOM 변경 후 스크린 리더 등 보조 기술에 잘못된 역할 정보가 전달되는 문제

해결 내용

accessible name 변경으로 인한 지연 역할 업데이트(deferred tree update) 조건 및 관련 핸들러 구조를 전체적으로 보완하였습니다.

  1. 이름 의존적 역할(Name-dependent role) 재계산 조건 추가:
    • 기존에는 <section> 및 role="region" 변경만 감지하던 로직에 role="form" 조건을 포함시켰습니다.
    • 코드 중복 방지 및 모듈 간 동기화를 위해 기존 AXObject::IsNameDependentAriaRole() 헬퍼 메서드를 활용하도록 리팩터링하였습니다.
  2. 리뷰 피드백을 반영한 리팩터링 및 명칭 정돈:
    • 특정 역할(section, region)에 국한되었던 함수명(SectionOrRegionRole...)을 스펙 용어에 맞게 NameDependentRolesMaybeChangedWithCleanLayout으로 변경하였습니다.
    • 연관된 TreeUpdateReason 열거형(enumerator) 명칭도 kNameDependentRolesMaybeChangedFrom*로 일괄 변경하였습니다.
    • 주석을 HTML-AAM 스펙 명세 출처(w3c/html-aam) 명시와 함께 깔끔하게 정돈하였습니다.

테스트 방법

리뷰에 따라 단위 테스트, 통합 테스트 추가

  1. 단위 테스트: AXObjectCache에 role=form에 동적으로 추가하는 테스트
  2. 통합 테스트: aria-label 을 동적으로 설정 시 올바른 AXForm 역할로 업데이트되는지 확인

배운 점

  • Blink 랜더러의 접근성 구조에서 accessible name 변경 이벤트와 캐시된 Role 갱신 간의 연동 흐름 학습
  • 리뷰어 피드백을 통해 모듈 전체의 일관성을 맞추는 네이밍 정돈(TreeUpdateReason)과 헬퍼 메서드 재활용의 중요성을 학습