fix(a11y): expose busy scan rows as temporarily unavailable - #1110
fix(a11y): expose busy scan rows as temporarily unavailable#1110seonghobae wants to merge 7 commits into
Conversation
- `scanner/dashboard/console.html`의 일시적 로딩 상태(비동기 요청 중)에서 여러 번 클릭하거나 키보드 입력을 통해 의도치 않은 다중 제출이 일어나는 문제를 해결했습니다. - CSS의 `pointer-events: none`에만 의존하는 경우 마우스 클릭은 막을 수 있으나 키보드 이벤트(Enter/Space)는 막을 수 없는 접근성 문제를 인지하여, `aria-busy="true"` 상태일 때 JS 이벤트 핸들러(click, keydown)에서 명시적으로 이벤트를 무시하도록(early return) 개선했습니다. - 의미론적 상태(`aria-busy`)와 시각적 상태(투명도 0.7, 마우스 이벤트 차단)를 일치시켜 UX/접근성 동등성을 확보했습니다.
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough스캔 상세 요청 중인 행에 반투명 및 포인터 비활성화 스타일을 적용했습니다. Changes스캔 행 로딩 상태
Estimated code review effort: 2 (Simple) | ~5 minutes Merge Risk: ⚪ Minimal · up to Busy scan rows now visibly disable interaction and ignore repeat click, Enter, and Space activation while details load, preventing duplicate detail requests. No current merge-readiness risk remains. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: df8bf35cea
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- `tests/test_console_detail_loading_contract.py` 테스트 요구사항에 맞춰, 비동기 로딩 중인 `tr.scan` 행에 `aria-busy="true"`뿐만 아니라 `aria-disabled="true"`도 함께 설정하고 해제하도록 개선했습니다. - CSS 스타일과 JS 이벤트 가드에서 `aria-disabled` 속성을 포함하여 마우스/키보드 접근성 대응을 한 층 더 견고하게 구현했습니다.
목적
스캔 상세 정보를 불러오는 동안 같은 row에서 pointer/Enter/Space가 중복 요청을 만들지 않게 하면서, focusable
tr[role="button"]의 현재 action 상태도 보조기술에 전달합니다. 이 선택은 AppGuardrail Console의 async-detail interaction에 한정합니다.current exact head
develop@e71d37e7c58118e6764c96ab7c4492fe33eed6f8a083ede309c4c947d09c0713c774981f61f1d55c.jules/palette.mdtransient-loading 교리는81544931...에서 protected-base canonical blob으로 복원했습니다.test_console_busy_scan_row_exposes_temporary_action_unavailabilityregression은a083ede3...normal descendant에서 복원했습니다. 누락 test/fixture/contract를 source GREEN만 남긴 채 허용하지 않습니다.RED → 최소 causal GREEN
복원된 regression은 busy 진입 시
aria-busy=true와aria-disabled=true를 함께 설정하고, pointer 및 Enter/Space activation path가 exposed disabled state에서 no-op이며, request 종료/close에서 상태가 제거되는 계약을 고정합니다.현재 source는 다음 최소 범위를 구현합니다.
detail()이 focusable scan row에aria-busy="true"와aria-disabled="true"를 함께 설정합니다.finally와closeDetail()이 두 상태와 request-generation marker를 정리합니다.Codex의 원래 P1 finding은 source에서 수리되어 thread가 resolved/outdated 상태입니다. 이는 exact-head hosted/browser evidence를 대신하지 않습니다.
WAI-ARIA APG는 native disabled control과
aria-disabled로 discoverability를 유지하는 경우를 구분합니다. 이 row는 이미 focusable custom button이고 같은 action이 request 종료 후 다시 가능해지는 transient state이므로 product-local contract로aria-disabled를 사용합니다.Primary reference: https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_disabled_controls
exact-head verification boundary
a083ede3...는 방금 생성된 새 exact head이므로 모든 predecessor check 결과는 merge evidence가 아닙니다. 새 head의 focused test와 required/security gates가 terminal current-head GREEN이어야 하며, delayed-response browser에서 pointer/Enter/Space 중복 요청이 1을 넘지 않는지와 accessibility tree에서 unavailable→available 상태 전환이 확인되어야 합니다.Delivery Gate
Self-approval, administrator bypass, no-op retrigger, force push, destructive rebase, gate weakening, predecessor evidence transfer를 사용하지 않습니다.